首页 > 代码库 > 关于用POI和EXCEL交互的问题

关于用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