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

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; // 写入到FileOutputStream
		WritableWorkbook wwb = null;
		try {
			byte[] imgDate = getSloganMark(slogan, width, height);
			//获得excel
			System.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 exception
			e.printStackTrace();
			return false;
		} finally {	
			if(wwb != null){				
				try {
					wwb.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(out != null){				
				try {
					out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(in != null){				
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.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 block
				e.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,如果能解决的话又是一件大功德啊

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值