• JAVA利用JXL导出/生成 EXCEL1


    /**
         * 导出导出采暖市场部收入、成本、利润明细表
         * @author JIA-G-Y
         */
        public String exporExcel(String str) {

      String str=ServletActionContext.getServletContext().getRealPath("\statics\attachment\excel\");
      String path = str+"\user.xls";

    try {
                List<WholesaleAgreementMaterialExportExcelTemplate> list = agreementDao.selectAllWholeDetails();
    //          打开文件
                WritableWorkbook book = Workbook.createWorkbook( new File(path));
    //          生成名为“第一页”的工作表,参数0表示这是第一页
                WritableSheet sheet = book.createSheet( " 第一页 " , 0 );
                SheetSettings ss = sheet.getSettings();
                // ss.setHorizontalFreeze(2);  // 设置列冻结
                ss.setVerticalFreeze(2);  // 设置行冻结前2行
     
                WritableFont font1 =new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
                WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
                WritableCellFormat wcf = new WritableCellFormat(font1);
                WritableCellFormat wcf2 = new WritableCellFormat(font2);
                WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体
                 
                // wcf2.setBackground(Colour.LIGHT_ORANGE);
                wcf.setAlignment(Alignment.CENTRE);  //平行居中
                wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
                wcf3.setAlignment(Alignment.CENTRE);  //平行居中
                wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
                wcf3.setBackground(Colour.LIGHT_ORANGE);
                wcf2.setAlignment(Alignment.CENTRE);  //平行居中
                wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
     
                sheet.mergeCells( 1 , 0 , 13 , 0 ); // 合并单元格  
     
    //          在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
    //          以及单元格内容为test
                Label titleLabel = new Label( 1 , 0 , " 采暖市场部收入、成本、利润明细表 ",wcf);
    //          将定义好的单元格添加到工作表中
                sheet.addCell(titleLabel);
                sheet.setRowView(1, 500); // 设置第一行的高度  20121111
                int[] headerArrHight = {13,10,30,20,20,25,7,10,15,20,13,15,15,30};
                String headerArr[] = {"年份","月份","经销商","合同号","产品","规格","数量","单价(元)","收款金额(元)","收款不含税价(元)","成本(元)","毛利(元)","毛利率","备注"};
                for (int i = 0; i < headerArr.length; i++) {
                    sheet.addCell(new Label( i , 1 , headerArr[i],wcf));
                    sheet.setColumnView(i, headerArrHight[i]);
                }           
                DecimalFormat df = new DecimalFormat("#.00");
                int conut = 2;
                for (int i = 0; i < list.size(); i++) {   //循环一个list里面的数据到excel中
                    sheet.addCell(new Label( 0 , conut ,list.get(i).getFromDate().substring(0, 4) + "年" ,wcf2));
                    sheet.addCell(new Label( 1 , conut ,list.get(i).getFromDate().substring(4, 6) + "月" ,wcf2));
                    sheet.addCell(new Label( 2 , conut ,list.get(i).getCustomerName() ,wcf2));
                    sheet.addCell(new Label( 3 , conut ,list.get(i).getAgreementCode() ,wcf2));
                    sheet.addCell(new Label( 4 , conut ,list.get(i).getBrandName() ,wcf2));
                    sheet.addCell(new Label( 5 , conut ,list.get(i).getType() ,wcf2));
                    sheet.addCell(new Label( 6 , conut ,list.get(i).getQuantity().substring(0, list.get(i).getQuantity().indexOf(".")) ,wcf2));
                    sheet.addCell(new Label( 7 , conut ,list.get(i).getUnivalent() ,wcf2));
                    sheet.addCell(new Label( 8 , conut ,list.get(i).getReceiptAmount()+"" ,wcf2));// 收款金额
                    sheet.addCell(new Label( 9 , conut ,df.format(list.get(i).getReceiptNoTax()) ,wcf2));// 收款不含税价
                    sheet.addCell(new Label( 10 , conut ,list.get(i).getCost()+"" ,wcf2));//成本
                    sheet.addCell(new Label( 11 , conut ,df.format(list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1)))) ,wcf2));// 毛利
                    BigDecimal bigDecimal = list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1)));
                    double bigDecimal2 = bigDecimal.doubleValue()/list.get(i).getReceiptNoTax().doubleValue();
                    sheet.addCell(new Label( 12 , conut ,(df.format(bigDecimal2*100)) + "%" ,wcf2));
                    sheet.addCell(new Label( 13 , conut ,list.get(i).getRemark() ,wcf2));
                    sheet.setRowView(conut, 370); // 设置第一行的高度
                    conut++;
                }
                sheet.setRowView(list.size() + 2, 370);
                sheet.setRowView(list.size() + 3, 370);
                sheet.setRowView(list.size() + 4, 370);
                sheet.setRowView(list.size() + 5, 370);
                 
                double sumZ = 0.00; //收款总额
                double sumT = 0.00; // 收款不含税价
                double sumC = 0.00; // 成本
                double sumM = 0.00; // 毛利
                for (int i = 0; i < list.size(); i++) {
                    sumZ += list.get(i).getReceiptAmount().doubleValue();
                    sumT += list.get(i).getReceiptNoTax().doubleValue();
                    sumC += list.get(i).getCost().doubleValue();
                    sumM += list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1))).doubleValue();
                }
                sheet.addCell(new Label( 0 , list.size() + 3 ,"合计:" ,wcf));
                sheet.addCell(new Label( 8 , list.size() + 3 ,df.format(sumZ) ,wcf));
                sheet.addCell(new Label( 9 , list.size() + 3 ,df.format(sumT) ,wcf));
                sheet.addCell(new Label( 10 , list.size() + 3, df.format(sumC) ,wcf));
                sheet.addCell(new Label( 11 , list.size() + 3 ,df.format(sumM) ,wcf));
                sheet.addCell(new Label( 13 , list.size() + 5 ,"导出时间:" + new Date().toLocaleString() ,wcf3));
                 
    //          写入数据并关闭文件
                book.write();
                book.close();
                return path;
            } catch (Exception e) {
            }
            return path;
        }
    复制代码

    jxl是java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式。

    使用如下:

    搭建环境

    将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。

    基本操作

    一、创建文件

    拟生成一个名为“test.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:

    package test; // 生成Excel的类 import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class CreateExcel { public static void main(String args[]) { try { // 打开文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " )); // 生成名为“第一页”的工作表,参数0表示这是第一页 WritableSheet sheet = book.createSheet( " 第一页 " , 0 ); // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0) // 以及单元格内容为test Label label = new Label( 0 , 0 , " test " ); // 将定义好的单元格添加到工作表中 sheet.addCell(label); jxl.write.Number number = new jxl.write.Number( 1 , 0 , 555.12541 ); sheet.addCell(number); // 写入数据并关闭文件 book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } }

    编译执行后,会产生一个Excel文件。

    二、读取文件

    以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:

    package test; // 读取Excel的类 import java.io.File; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; public class ReadExcel { public static void main(String args[]) { try { Workbook book = Workbook.getWorkbook( new File( " test.xls " )); // 获得第一个工作表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 Cell cell1 = sheet.getCell( 0 , 0 ); String result = cell1.getContents(); System.out.println(result); book.close(); } catch (Exception e) { System.out.println(e); } } }

    程序执行结果:test

    三、修改文件

    利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:

    package test; import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class UpdateExcel { public static void main(String args[]) { try { // Excel获得文件 Workbook wb = Workbook.getWorkbook( new File( " test.xls " )); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " ), wb); // 添加一个工作表 WritableSheet sheet = book.createSheet( " 第二页 " , 1 ); sheet.addCell( new Label( 0 , 0 , " 第二页的测试数据 " )); book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } }

    四、 数据格式化

    在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。

    字串格式化

    字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:

    WritableFont font1 =new WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); ①  WritableCellFormat format1 = new WritableCellFormat(font1); ②  Label label = new Label( 0 , 0 ,”data 4 test”,format1) ③

    其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的

    构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

    ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种

    属性,后面的单元格格式化中会有更多描述。

    ③处使用了Label类的构造子,指定了字串被赋予那种格式。

    在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:

    // 把水平对齐方式指定为居中 format1.setAlignment(jxl.format.Alignment.CENTRE); / 把垂直对齐方式指定为居中 format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

    五、单元格操作

    Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

    1、 合并单元格

    WritableSheet.mergeCells( int m, int n, int p, int q); // 作用是从(m,n)到(p,q)的单元格全部合并,比如: WritableSheet sheet = book.createSheet(“第一页”, 0 ); // 合并第一列第一行到第六列第一行的所有单元格 sheet.mergeCells( 0 , 0 , 5 , 0 );

    合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

    2、 行高和列宽

    WritableSheet.setRowView( int i, int height); // 作用是指定第i+1行的高度,比如: // 将第一行的高度设为200 sheet.setRowView( 0 , 200 ); WritableSheet.setColumnView( int i, int width); // 作用是指定第i+1列的宽度,比如: // 将第一列的宽度设为30 sheet.setColumnView( 0 , 30 );

    jExcelAPI还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。其中:如果读一个excel,需要知道它有多少行和多少列,如下操作:

    Workbook book = Workbook.getWorkbook( new File( " 测试1.xls " )); // 获得第一个工作表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 int columnum = sheet.getColumns(); // 得到列数 int rownum = sheet.getRows(); // 得到行数 System.out.println(columnum); System.out.println(rownum); for ( int i = 0 ; i < rownum; i ++ ) // 循环进行读写 { for ( int j = 0 ; j < columnum; j ++ ) { Cell cell1 = sheet.getCell(j, i); String result = cell1.getContents(); System.out.print(result);
  • 相关阅读:
    Leetcode 238. Product of Array Except Self
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 290. Word Pattern
    Leetcode 205. Isomorphic Strings
    Leetcode 107. Binary Tree Level Order Traversal II
    Leetcode 102. Binary Tree Level Order Traversal
    三目运算符
    简单判断案例— 分支结构的应用
    用switch判断月份的练习
    java基本打印练习《我行我素购物系统》
  • 原文地址:https://www.cnblogs.com/mengyuxin/p/5000682.html
Copyright © 2020-2023  润新知