POI 导出excel

近期,在系统优化的需求中,客户提出:系统所有的Excel导出时需添加水印。Excel导出添加的水印不同于图片生成时添加水印,百度了一下Excel文件的水印添加的方法,为程序导出时添加水印寻找思路。

Excel中水印效果实现探讨一文对水印的添加描述比较详细(http://hi.baidu.com/daxiongmao_adi/blog/item/d42c50b40cea49798bd4b20d.html ),我取其中的第二种方法,设置背景图片,以完成水印效果。具体解决思路是:制作一个有水印Excel模版,所有生成的excel文件均以此模块为底,完成水印的复制添加效果。

查阅原系统代码,在Excel导出时采用jxl组件,而jxl的API对excel文件的操作分可读、可写的操作权限,不利于复制一个模版,在模板中做新插入内容的添加。于是修改为POI组件进行处理。

具体实现的代码测试用例如下:
/**templateFilePath 模版文件路径  exportFilePath导出文件路径*/
public static void exportExcel(String templateFilePath,String exportFilePath) {
   POIFSFileSystem fs = null;
   try {
    fs = new POIFSFileSystem(new FileInputStream(templateFilePath));//获取模版
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);//获取第一个sheet页

     int f0041_i = 0; //列数
     int f0041_j = 0;//行数
     
     //以下为测试准备数据
     List rowList = new ArrayList();//行集合
     List exlFile=new ArrayList();//各个列数据值集合
    exlFile.add("工号类型");exlFile.add("组织机构");exlFile.add("工号代码");exlFile.add("工号名称");exlFile.add("员工代码");
    exlFile.add("工号级别");exlFile.add("生效时间");exlFile.add("失效时间");exlFile.add("登录允许开始时间");exlFile.add("登录允许结束时间");
    exlFile.add("密码修改间隔");exlFile.add("MAC地址");exlFile.add("联系电话");exlFile.add("重复登录标志");
    exlFile.add("工号有效标志");exlFile.add("权限级别");exlFile.add("发送密码标志");exlFile.add("最大错误次数");exlFile.add("备注");
   
    rowList.add(exlFile);
   
    List exl=new ArrayList();//结果集模拟
    exl.add("客户经理");exl.add("长江路营业厅");exl.add("12985");exl.add("张三");exl.add("A0H0111111");
    exl.add("普通员 工");exl.add("2008-10-05");exl.add("2010-10-05");exl.add("2008-10-05");exl.add("2010-10-05");exl.add("3 个月");exl.add("10:44:FF:CC:BA:01");
    exl.add("0551-8888888");exl.add("有效");exl.add("有效");exl.add("3级");exl.add("loginPwd");exl.add("5");exl.add("无");
   
    rowList.add(exl);
    rowList.add(exl);
    rowList.add(exl);
    rowList.add(exl);
    rowList.add(exl);
   
    //按照每一行、每一列进行循环输出
    for(f0041_j=0;f0041_j<rowList.size();f0041_j++){
     List f0041_it =(List)rowList.get(f0041_j);
     HSSFRow row = sheet.createRow(f0041_j);//创建excel行
     if(null!=f0041_it){
       for(f0041_i=0;f0041_i<f0041_it.size();f0041_i++){
        String f0041_cont = (String)f0041_it.get(f0041_i);
         HSSFCell cell = row.createCell(f0041_i);//创建excel单元格
               cell.setCellType(HSSFCell.CELL_TYPE_STRING);//创建单元格数据为字符串
                  //生成一个样式
                 HSSFCellStyle style=wb.createCellStyle();
                  //生成一个字体
                 HSSFFont font=wb.createFont();
                 
                //设置这些样式
                 if(f0041_j==0){
                   style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//设置填充背景为天蓝色
                   font.setColor(HSSFColor.VIOLET.index);//设置字体为紫色
                   font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//设置字体为加粗
                    font.setFontHeightInPoints((short)12);//设置字体大小为12号
                 }else{
                   style.setFillForegroundColor(HSSFColor.WHITE.index);
                   font.setColor(HSSFColor.BLACK.index);
                   font.setFontHeightInPoints((short)11);
                 }
                 
                 style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//设置填充模式为前景色
                 style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//设置边框样式
                 style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                 style.setBorderRight(HSSFCellStyle.BORDER_THIN);
                 style.setBorderTop(HSSFCellStyle.BORDER_THIN);
                 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
               
                //把字体应用到当前的样式
                 style.setFont(font);
                 cell.setCellStyle(style);
               cell.setAsActiveCell();//设置单元格为激活单元格
               cell.setCellValue(f0041_cont);//设置单元格内容
       }
      }
    }
   
    //构造输出流
    FileOutputStream fileOut = new FileOutputStream(new String(exportFilePath));
    wb.write(fileOut);//导出excel文件
    fileOut.close();//关闭输出流

   } catch (FileNotFoundException e) {//模版文件未找到异常捕获处理
    System.out.println(e.getMessage());
   
   } catch (IOException e) {//文件流异常捕获处理
    System.out.println(e.getMessage());
   }
}
效果图如下:
以下是使用Java的POI导出Excel文件的步骤: 1. 首先,需要在项目中引入POI的依赖,可以通过Maven或手动下载jar包的方式引入。 2. 创建一个工作簿对象,可以通过HSSFWorkbook或XSSFWorkbook类来创建,前者用于创建xls格式的Excel文件,后者用于创建xlsx格式的Excel文件。 3. 创建一个工作表对象,可以通过工作簿对象的createSheet()方法来创建。 4. 创建行和单元格对象,可以通过工作表对象的createRow()和createCell()方法来创建。 5. 设置单元格的值,可以通过单元格对象的setCellValue()方法来设置。 6. 将工作簿对象写入到输出流中,可以通过工作簿对象的write()方法来实现。 以下是一个简单的示例代码,用于将数据导出Excel文件中: ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class ExcelExporter { public static void export() throws IOException { // 创建工作簿对象 Workbook workbook = new HSSFWorkbook(); // 创建工作表对象 Sheet sheet = workbook.createSheet("Sheet1"); // 创建行对象 Row row = sheet.createRow(0); // 创建单元格对象 Cell cell = row.createCell(0); // 设置单元格的值 cell.setCellValue("Hello, World!"); // 将工作簿对象写入到输出流中 FileOutputStream fos = new FileOutputStream("output.xls"); workbook.write(fos); fos.close(); } } ``` 调用export()方法即可将数据导出到名为output.xls的Excel文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值