jxl创建excel加水印

最近做个excel加水印的,在网上找了很多,都是使用jxl添加,但是本地测试一直没有通过,主要原因是因为背景图片不符合要求,后来找了image4j来做成图片,完成了背景图片的添加,需要用到的jxl.jarimage4j.jar,具体代码如下:

package com.file;

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.regex.Pattern;

import jxl.Range;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import net.sf.image4j.codec.bmp.BMPEncoder;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

/**
 *
 *
 * @date 2014-5-16
 */
@Component
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ExcelWriter {

	private WritableWorkbook book;

	private static final Logger LOG = Logger.getLogger(ExcelWriter.class);
	private FileInputStream fis = null;
	private File watermarkFileName = null;
	private int width = 480; // 水印图片的宽度
	private int height = 1020; // 水印图片的高度 因为设置其他的高度会有黑线,所以拉高高度

	public void createBook(String excelName, String path) {
		if (book == null) {
			try {
				book = Workbook
						.createWorkbook(new File(path + "\\" + excelName));
				watermarkFileName = new File(System.getProperty("user.dir")
						+ "/" + System.currentTimeMillis() + ".bmp");
			} catch (IOException e) {
				e.printStackTrace();
				LOG.error(e.getMessage(), e);
			}
		}
	}

	public void createBook(File file) {
		if (book == null) {
			try {
				if (file.exists()) {
					Workbook book1 = Workbook.getWorkbook(file);
					book = Workbook.createWorkbook(file, book1);
				} else {
					book = Workbook.createWorkbook(file);
					watermarkFileName = new File(System.getProperty("user.dir")
							+ "/" + System.currentTimeMillis() + ".bmp");
				}
			} catch (IOException e) {
				e.printStackTrace();
				LOG.error(e.getMessage(), e);
			} catch (BiffException e) {
				e.printStackTrace();
			}
		}
	}

	public void createBook(OutputStream os) {
		if (book == null) {
			try {
				book = Workbook.createWorkbook(os);
				watermarkFileName = new File(System.getProperty("user.dir")
						+ "/" + System.currentTimeMillis() + ".bmp");
			} catch (IOException e) {
				e.printStackTrace();
				LOG.error(e.getMessage(), e);
			}
		}
	}

	public void closeBook() {
		try {
			book.write();
			book.close();
			if (fis != null) {
				fis.close();
			}
			// 删除临时的水印文件
			if (watermarkFileName != null && watermarkFileName.exists()) {
				watermarkFileName.delete();
			}
		} catch (Exception e) {
			e.printStackTrace();
			LOG.error(e.getMessage(), e);
		}
	}

	/**
	 * data <string[]>
	 *
	 * @param data
	 * @param sheetName
	 */
	public void writerSheet(List data, String sheetName, String watermark) {
		WritableSheet sheet = book.createSheet(sheetName,
				book.getNumberOfSheets() + 1);

		Pattern p = Pattern
				.compile("(\\-|\\+)?[0-9]+\\.?[0-9]*((E|e)\\+[0-9]+)?");

		Pattern p1 = Pattern.compile("[0-9]{15,18}");// 身份证

		for (int i = 0; i < data.size(); i++) {
			String[] lines = (String[]) data.get(i);

			for (int j = 0; j < lines.length; j++) {
				try {
					if ("#rspan".equalsIgnoreCase(lines[j])) {

						// 判断是否是最后一个#rspan不是最后一个就直接pass
						if (i + 1 < data.size()) {
							String[] lines1 = (String[]) data.get(i + 1);

							if ("#rspan".equalsIgnoreCase(lines1[j])) {
								continue;
							}
						}
						// 再判断第一个rowspan的位置
						int rowOffset = 1;
						while (i - rowOffset > 0) {

							String[] lines1 = (String[]) data
									.get(i - rowOffset);
							if (!"#rspan".equalsIgnoreCase(lines1[j])) {
								break;
							}
							rowOffset++;
						}

						Range range = sheet.mergeCells(j, i - rowOffset, j, i);

						if (range.getTopLeft() instanceof Label) {
							Label cell = (Label) range.getTopLeft();
							WritableCellFormat wcf = new WritableCellFormat();
							wcf.setAlignment(Alignment.CENTRE);
							wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
							cell.setCellFormat(wcf);
						}
					} else if ("#cspan".equalsIgnoreCase(lines[j])) { // 判断是否是合并列
						// 判断是是合并Range的最后一个
						if (j + 1 < lines.length
								&& "#cspan".equalsIgnoreCase(lines[j + 1])) {
							continue;
						}

						int colOffset = 1;
						while (j - colOffset > 0) {
							if (!"#cspan"
									.equalsIgnoreCase(lines[j - colOffset])) {
								break;
							}
							colOffset++;
						}
						Range range = sheet.mergeCells(j - colOffset, i, j, i);
						if (range.getTopLeft() instanceof Label) {
							Label cell = (Label) range.getTopLeft();
							WritableCellFormat wcf = new WritableCellFormat();
							wcf.setAlignment(Alignment.CENTRE);
							cell.setCellFormat(wcf);
						}
					} else {
						WritableCell cell = null;
						String val = lines[j];
						if (val != null && p1.matcher(val).matches()) {
							cell = new Label(j, i, val);
						} else if (val != null && p.matcher(val).matches()) {
							cell = new jxl.write.Number(j, i,
									Double.parseDouble(val));
						} else {
							cell = new Label(j, i, val);
						}

						sheet.addCell(cell);
					}
				} catch (RowsExceededException e) {
					e.printStackTrace();
				} catch (WriteException e) {
					e.printStackTrace();
				}
			}

		}
		// 添加水印
		if (watermark != null && !"".equals(watermark)
				&& watermark.length() < 20) {
			try {
				File file = // new
							// File("C:/Users/Administrator/Downloads/test/kkkk.bmp");
				createWaterMark(watermark);
				byte[] imageByte = new byte[(int) file.length()];
				fis = new FileInputStream(file);
				fis.read(imageByte);
				sheet.setWaterMarkImage(imageByte, width, height);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 生成水印图片
	 *
	 * @param watermark
	 * @return
	 * @throws IOException
	 */
	public File createWaterMark(String watermark) throws IOException {

		// 获取bufferedImage对象
		BufferedImage bi = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		// 处理背景色,设置为 白色
		int minx = bi.getMinX();
		int miny = bi.getMinY();
		for (int i = minx; i < width; i++) {
			for (int j = miny; j < height; j++) {
				bi.setRGB(i, j, 0xffffff);
			}
		}

		// 获取Graphics2d对象
		Graphics2D g2d = bi.createGraphics();
		// 设置字体颜色为灰色
		g2d.setColor(Color.LIGHT_GRAY);
		// 设置图片的属性
		g2d.setStroke(new BasicStroke(1));
		// 设置字体
		g2d.setFont(new Font("华文细黑", Font.ITALIC, 20));
		// 设置字体倾斜度
		g2d.rotate(Math.toRadians(-10));

		// 写入水印文字 原定高度过小,所以累计写水印,增加高度
		for (int i = 1; i < 26; i++) {
			g2d.drawString(watermark, 0, 40 * i);
		}
		// 设置透明度
		g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
		// 释放对象
		g2d.dispose();
		// 通过bmp写入文件
		BMPEncoder.write(bi, watermarkFileName);

		return watermarkFileName;
	}

	public static void main(String[] args) {
		ExcelWriter book = new ExcelWriter();
		// try {
		// book.createWaterMark("test");
		// } catch (IOException e) {
		// e.printStackTrace();
		// }
		List list = new java.util.ArrayList();

		String[] lines = { "105621", "2", "3", "excel带水印" };
		list.add(lines);
		book.createBook("out.xls", "d:\\");

		book.writerSheet(list, "excel带水印", "测试");

		// book.writerSheet(list, "我是傻逼2");

		book.closeBook();

		System.out.println("1.8e+04"
				.matches("(\\-|\\+)?[0-9]+\\.?[0-9]*((E|e)\\+[0-9]{2})?"));
	}
}

jxl创建excel加水印

时间: 2024-08-24 11:01:55

jxl创建excel加水印的相关文章

jxl创建Excel文件java代码示例

记得要下载 并 导入 jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import java.io.*; import jxl.*; import jxl.format.Colour; import jxl.write.*; public class JXLTest { private static WritableWorkbook book; private static Wr

Excel之JXL创建

创建excel文件,并写入数据 1.创建Project,导入 :jarcommons-io-2.2.jar    jxl.jar  poi-3.11-20141221.jar  去下载jar 2.编写代码: package com.imooc.excel; import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.Writab

使用JXL对Excel表格进行简单的操作

前段时间由于项目的需求,要求使用JXL,做完之后做下记录,方便以后查看! 首先我们要先下载JXL的JAR包:http://download.csdn.net/detail/u013352832/7777047 将JXL.JAR 包导入到项目中即可直接只用! 直接上代码 使用JXL来操作Excel表格,我们应该首先判断一下Excel表格是否存在 1 File file = new File(user.getZkfp()); 2 // 判断zkfp.xls文件是否存在,不存在则创建zkfp.xls文

用jxl导出Excel

断断续续,终于把这个简单的功能实现了. 本身花的有效时间也不多,但是陆续出现好多蛋疼的问题,归根结底是自己程序功底不深厚,尤其对Java流理解不透彻. 还好今天时间充足,磨得我背疼不已的时候,终于把它整完了. 这里首先介绍下背景:SSM框架(前端easyui).POI因为乱码问题被pass掉.五一假期又没有花时间,不得不赶紧换个API把他整出来. 功能大致是这样的: 点击按钮导出所有的(不经分页的)数据到Excel中. busiAccept.jsp 1 <%@ page language="

jxl读写excel

实例一:读excel: import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cell; import jxl.CellType; import jxl.Sheet; import jxl.Workbook; import jxl.write.Label; public class xls { public static void main(String[] args

Java中用JXL导出Excel代码详解

jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件. 另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式.使用如下:搭建环境 将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了.

Java文件操作系列[2]——使用JXL操作Excel文件

由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别是:JXL较为轻量级,如果是对Excel文件的简单操作,建议使用JXL:POI的功能相当强大,但同时处理问题也相当的繁琐. 1.准备工作 [必需]下载JXL的jar包:jxl.jar [非必需]JXL API  (提取密码:zgqj) 2.一些必要的说明 主要是对Excel结构的说明: Excel后

jxl(Java Excel API) 使用方法 【1】

//   构建Workbook对象, 只读Workbook对象  //   直接从本地文档创建Workbook  //   从输入流创建Workbook Workbook workbook = null;    try {      workbook = Workbook.getWorkbook(new File("D://output.xls"));    } catch (Exception e) {     e.printStackTrace();    } //返回正在使用的A

JXL操作Excel文件

jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件. 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式. 1.创建一个test.xls文件,向其写入数据 package com.ccit; imp