WEB应用Excel报表加水印解决方案

来源:互联网 发布:c语言杨辉三角不用数组 编辑:程序博客网 时间:2024/06/09 14:29

2个月前接到了报表加水印的需求后,就开始了痛苦之旅,今天总算是上线成功了,记录一下。

环境 aix 5.3,weblogic10,jdk6

需要的第三方JAR包http://download.csdn.net/download/boywish/2257294,这是一个好人改的jar包,但是在用的时候会出一些问题,无奈没有别的选择了

JAVA调用代码:

import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.font.FontRenderContext;import java.awt.geom.Rectangle2D;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.imageio.ImageIO;import jxl.Workbook;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;public class ExcelTool {/** *  * @param filepath excel地址 * @param slogan  水印内容 * @return */public static boolean addWaterMark(String filepath,String slogan){int width = 800;int height = 400;FileInputStream in = null;OutputStream out = null; // 写入到FileOutputStreamWritableWorkbook wwb = null;try {byte[] imgDate = getSloganMark(slogan, width, height);//获得excelSystem.out.println(filepath);in = new FileInputStream(filepath);Workbook wb = Workbook.getWorkbook(in);out = new FileOutputStream(filepath);wwb = Workbook.createWorkbook(out, wb);WritableSheet[] sheets = wwb.getSheets();for(int i = 0;i<sheets.length;i++){WritableSheet sheet = wwb.getSheet(i); // 得到工作薄中的第i个工作表//将图片设置成背景sheet.setWaterMarkImage(imgDate, width, height);}wwb.write();return true;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();return false;} finally {if(wwb != null){try {wwb.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(out != null){try {out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(in != null){try {in.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/** * 生成文字水印内容 * @param slogan * @param width * @param height * @return */private static byte[] getSloganMark( String slogan, int width, int height)  {BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g = (Graphics2D) image.getGraphics();g.fillRect(0, 0, width, height);//背景框Font font = new Font("宋体",Font.BOLD,36);g.setFont(font);//设置字体//计算居中点的坐标FontRenderContext context = g.getFontRenderContext();Rectangle2D bounds = font.getStringBounds(slogan, context);double x = (width-bounds.getWidth())/2;double y = (height-bounds.getHeight())/2;//上画布g.setColor(new Color(135,206,235));//设置字体颜色,天蓝色g.drawString(slogan, (int)x, (int)y);//画上画布g.dispose();//写入文件ByteArrayOutputStream out = new ByteArrayOutputStream();try {ImageIO.write(image,"BMP",out);return out.toByteArray();} catch (IOException e) {e.printStackTrace();return null;} finally{try {if(out != null){out.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {System.out.println("begin..."+args.length);if(args != null && args.length > 1){System.out.println(args[0]+","+args[1]);addWaterMark(args[0],args[1]);}}}


 

首先,你要注意,JDK1.4是没法用的,大概原因是缺少图形包的原因,深层原因我没有查出来。其次jxl是不支持excel2007的,会报数组越界的错,就算是另存为.xls后缀也不行。

接着开始替换jxl.jar,这里会出现一个蛋疼的问题,weblogic会不认识新的jxl包,具体原因未知,网上也有很多人在问,怀疑和签名有关。

那么我们就绕过去,使用shell脚本来调用这个工具类,脚本很简单,就一句话:

java -cp /weblogic/bea/user_projects/domains/base_domain/lib/jxl.jar:/weblogic/bea/user_projects/domains/base_domain/lib:. ExcelTool $1 $2

(jdk1.4的话,另外装个JDK6,再加上环境变量,说不定也能跑,我还没试,这是下一步的计划)

把ExcelTool.class和新的jxl.jar放在域lib文件夹下面的,ExcelTool不加包,要不用-cp时又是一大堆错

java中调用shell脚本:

String unixcommand = "sh /weblogic/bea/user_projects/domains/base_domain/autodeploy/hzhb/shell/AddWaterMaker.sh '"+filepath+"' '"+slogan+"'";

 

这样功能就成了,接下来准备查一下为啥weblogic不认识jxl,如果能解决的话又是一件大功德啊