近期,在系统优化的需求中,客户提出:系统所有的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();//关闭输出流
System.out.println(e.getMessage());
} catch (IOException e) {//文件流异常捕获处理
System.out.println(e.getMessage());
}
}
效果图如下:
