2个月前接到了报表加水印的需求后,就开始了痛苦之旅,今天总算是上线成功了,记录一下。
环境 aix 5.3,weblogic10,jdk6
需要的第三方JAR包http://download.youkuaiyun.com/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,如果能解决的话又是一件大功德啊