zoukankan      html  css  js  c++  java
  • 关于用POI和EXCEL交互的问题

    废话不多说,直接通过例子来说明POI的使用:

    1.一个创建excel并写入数据的小例子,参照网上的一个例子:

    public class CreateXL {
    
        /**
         * @param args
         */
        public static String outputFile="D:\test.xls";
    
        public static void main(String[] args) {
            
                //创建新的excel工作薄
                try {
                    HSSFWorkbook workbook=new HSSFWorkbook();
                     // 在Excel工作簿中建一工作表,其名为缺省值 
                    // 如要新建一名为"报表导出"的工作表,其语句为:  
                    // HSSFSheet sheet = workbook.createSheet("报表导出");
                    HSSFSheet sheet=workbook.createSheet();
                      // 在索引0的位置创建行(最顶端的行)
                    HSSFRow row=sheet.createRow(0);
                      //在索引0的位置创建单元格(左上端)
                    HSSFCell cell=row.createCell(0);
                      // 定义单元格为字符串类型
                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                      // 在单元格中输入一些内容
                    cell.setCellValue("测试");
                       HSSFCellStyle cellStyle = workbook.createCellStyle();
                       cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_TURQUOISE.index);//设置背景色
                       cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//设置前景色
                       //通过背景色和前景色的不同来使每行的颜色交叉展现,有待测试
                       cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                       cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//设置居中
                       sheet.setColumnWidth(0, 4000);
                       //sheet.setDefaultColumnWidth(12);  //设置为12字节的宽度
                    cell.setCellStyle(cellStyle);
                     // 新建一输出文件流
                    FileOutputStream fout=new FileOutputStream(outputFile);
                    // 把相应的Excel 工作簿存盘
                    workbook.write(fout);
                     // 操作结束,关闭文件
                    fout.flush();
                    fout.close();
                    System.out.println("excel已生成");
                } catch (Exception e) {
                    System.out.println("创建文件失败"+e);
                    //e.printStackTrace();
                }     
        }
    }

    2.自己project中用到的

        public void rptImportModel() throws IOException {
           String fileName="报表导入模板.xls";
           HSSFWorkbook workbook=new HSSFWorkbook();
           HSSFSheet sheet=workbook.createSheet();
           HSSFRow row=sheet.createRow(0);
           //创建单元格样式风格
           HSSFCellStyle cellStyle = workbook.createCellStyle();
           cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//设置前景色
           cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
           cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//设置居中
           //创建单元格
           HSSFCell cellGrpNo = row.createCell(0);
           cellGrpNo.setCellType(HSSFCell.CELL_TYPE_STRING);
           cellGrpNo.setCellValue("组号");
           cellGrpNo.setCellStyle(cellStyle);
           HSSFCell cellNodeId=row.createCell(1);
           cellNodeId.setCellType(HSSFCell.CELL_TYPE_STRING);
           cellNodeId.setCellValue("报表节点ID");
           cellNodeId.setCellStyle(cellStyle);
           sheet.setColumnWidth(1, 8000);
           //为防止文件名出现中文乱码,需要对文件名进行字符集转换
           HttpServletResponse response = ServletActionContext.getResponse();
           String name = new String(fileName.getBytes("GBK"), "ISO8859_1");
           response.setHeader("Content-disposition", "attachment;filename=" + name);
           
           OutputStream os = null;
           os = response.getOutputStream();
           workbook.write(os);
           os.flush();
           os.close();
        }

    ---------------------------------------------------------------------------------------------------------------------------------------------

    总结如下:

    1.想下载前询问(是打开文件还是保存到计算机)和通过IE浏览器直接选择相关应用程序插件打开两种方式:

      ①response.setHeader("Content-disposition","attachment;filename="+ "Example.xls" );

      ②response.setHeader("Content-Disposition", "inline; filename=" + fliename)
      目前用过的是第一种,第二种有待测试。

    2.为防止导出的文件名出现乱码,需要对文件名进行URI解码,可以添加如下设置

           HttpServletResponse response = ServletActionContext.getResponse();
           String name = new String(fileName.getBytes("GBK"), "ISO8859_1");
           response.setHeader("Content-disposition", "attachment;filename=" + name );

      上面的第二行String()的函数查看API用法如下:

    String(byte[] bytes, Charset charset) 
              通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

    3.导出的excel格式的设置问题,今天下午想把导出的excel的第一行第一列单元格的背景色设置颜色,试了好多次,确实有点坑爹,设置如下:

         HSSFCellStyle cellStyle = workbook.createCellStyle();
              cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_TURQUOISE.index);//设置背景色

       cell.setCellStyle(cellStyle);
              除了添加上面几句,别忘了,需要在第二条语句下面添加下面的一句来将单元格填充,要不然没效果:

        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

              但是设置成这样子后,导出的excel单元格是黑色。试了好多次,发现了,用错方法了,第二条语句不应该是背景色,而是前景色!

       cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//设置前景色

            OK,这样子导出后,excel单元格有背景色了。但是,我想把某一列的宽度设置大一点

          sheet.setColumnWidth(0, 4000);

       感觉4000数据太大?但展示出来后不大,单元格宽度变长了,满足需求。也算是提供一个参考值。第一个参数表示设置第几列(从0开始),第二个参数表示设置的宽度大小。也不知道 这个数值设置大小有什么规律,反正我是没找出来,设置为负数结果宽度变的很大很大。

         当然也可以将所有列的宽度都设置大一点,可以用下面的方法

         sheet.setDefaultColumnWidth(12);  //设置为12字节的宽度

              但我是只是把某一列的宽度设置大点,所以上面的方法不合适。

    参考文档连接:http://bbs.csdn.net/topics/360003997

            http://luxhua.iteye.com/blog/464394

            http://hi.baidu.com/yljf1314/item/008762d1c9d5dc52d73aae47

            http://www.cnblogs.com/zhenmingliu/archive/2012/04/25/2469396.html

  • 相关阅读:
    vscode的settings.json最新配置
    RSA和AES混合使用的原理
    自己手动配置脚手架webpack完整详细版(一)
    MySQL下载安装教程完整版
    解决这三个问题的方法:abandon后重提代码、给sourcetree重加工程、ideal上查找历史版本代码、
    synchronized关键字,Lock对象,阻塞队列问题
    volatile关键字
    Python-根据成绩分析是否继续深造
    R语言-美国枪杀案分析
    R语言-ggplot初级
  • 原文地址:https://www.cnblogs.com/tanglc/p/3702079.html
Copyright © 2011-2022 走看看