使用poi生成Excel文件

 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipOutputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

/**
 * 
 * @修改时间:2011-9-24
 * @修改内容:添加单元格加边框、自动调整某列宽度、设置合并单元格
 * 
 */
public class XlsExport {

	// 设置cell编码解决中文高位字节截断
	// private static short XLS_ENCODING = HSSFWorkbook.ENCODING_UTF_16;

	private static enum XlsFormatEm {
		DATE("m/d/yy"), NUMBER("0.00"), CURRENCY("#,##0.00"), PERCENT("0.00%");
		private final String pattern;

		XlsFormatEm(String pattern) {
			this.pattern = pattern;
		}

		public String getPattern() {
			return this.pattern;
		}
	}

	private HSSFWorkbook workbook; //定义Excel文档对象
	private HSSFSheet sheet; //定义sheet页对象
	private HSSFRow row; //定义行对象
	private HSSFFont f; //定义字体对象
	private HSSFCellStyle style; //定义单元格样式对象

	/**
	 * 构造方法,设置字体、对齐方式、单元格加边框
	 * 
	 * @param sheetname
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public XlsExport(String sheetname) {
		this.workbook = new HSSFWorkbook();

		// 设置字体
		this.f = workbook.createFont();
		f.setFontName("宋体");
		f.setFontHeightInPoints((short) 12);

		this.style = workbook.createCellStyle();
		style.setFont(f);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置横向居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置纵向居中

		// 给excel单元格加边框
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框

		this.sheet = workbook.createSheet(sheetname);
		// this.sheet.setDefaultColumnWidth((short) 18);
	}

	public XlsExport(HSSFWorkbook workbook, HSSFSheet sheet) {
		this.workbook = workbook;
		this.sheet = sheet;
		// this.sheet.setDefaultColumnWidth((short) 18);
	}

	/**
	 * 自动调整某列宽度 setAutoColumnWidth
	 * 
	 * @param colNum
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void setAutoColumnWidth(short colNum) {
		sheet.autoSizeColumn(colNum); // 自动调整某列宽度
	}

	/**
	 * 设置合并单元格的区域的风格 setRegionStyle
	 * 
	 * @param sheet
	 * @param region
	 * @param cs
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	private void setRegionStyle(HSSFSheet sheet, Region region, HSSFCellStyle cs) {
		for (int i = region.getRowFrom(); i <= region.getRowTo(); i++) { //循环每一行
			HSSFRow row = sheet.getRow(i);
			for (int j = region.getColumnFrom(); j <= region.getColumnTo(); j++) {
				HSSFCell cell = row.getCell((short) j);
				cell.setCellStyle(cs);
			}
		}
	}

	/**
	 * 定义要合并的单元格
	 * addMerge
	 * @param rowFrom
	 * @param columnFrom
	 * @param rowTo
	 * @param columnTo
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void addMerge(int rowFrom, short columnFrom, int rowTo, short columnTo) {
		Region region = new Region(rowFrom, columnFrom, rowTo, columnTo);// 设置合并的行列
		this.setRegionStyle(sheet, region, style);// 设置合并单元格的风格(加边框)
		this.sheet.addMergedRegion(region);// 将单元格合并
	}

	/**
	 * 导出Excel文件
	 * exportXls
	 * @param xlsFileName文件名路径
	 * @throws RuntimeException
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void exportXls(String xlsFileName) throws RuntimeException {
		FileOutputStream fOut = null;
		try {
			fOut = new FileOutputStream(xlsFileName);
			workbook.write(fOut);
			fOut.flush();
		} catch (FileNotFoundException e) {
			RuntimeException fnf = new RuntimeException("生成导出Excel文件出错!", e);
		} catch (IOException e) {
			RuntimeException io = new RuntimeException("写入Excel文件出错!", e);
		} finally {
			try {
				if (fOut != null) {
					fOut.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 导出Excel文件
	 * exportXls
	 * @param response
	 * @throws RuntimeException
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void exportXls(HttpServletResponse response) throws RuntimeException {
		ServletOutputStream os = null;
		try {
			os = response.getOutputStream();
			workbook.write(os);
			os.flush();
		} catch (FileNotFoundException e) {
			throw new RuntimeException("生成导出Excel文件出错!", e);
		} catch (IOException e) {
			throw new RuntimeException("写入Excel文件出错!", e);
		} finally {
			try {
				if (os != null)
					os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 增加一行
	 * 
	 * @param index 行号
	 */
	public void createRow(HSSFSheet sheet, int index) {
		this.row = sheet.createRow(index);
		this.row.setHeight((short) 285);// 单位换算20等于excel表中的1
	}

	/**
	 * 增加一行
	 * 
	 * @param index 行号
	 */
	public void createRow(int index) {
		this.row = this.sheet.createRow(index);
		this.row.setHeight((short) 285);
	}

	/**
	 * 根据行号获取一行
	 * getRow
	 * @param rowNum行号
	 * @return
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public HSSFRow getRow(int rowNum) {
		return this.sheet.getRow(rowNum);
	}

	/**
	 * 设置单元格
	 * 
	 * @param index  列号
	 * @param value  单元格填充值
	 */
	public void setCell(int index, String value) {
		HSSFCell cell = this.row.createCell((short) index);
		// cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellStyle(style);
		cell.setCellValue(value);
	}

	/**
	 * 设置单元格
	 * 
	 * @param index  列号
	 * @param value  单元格填充值
	 */
	public void setCell(int index, int value) {
		HSSFCell cell = this.row.createCell((short) index);
		cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
		cell.setCellStyle(style);
		cell.setCellValue(value);
	}

	/**
	 * 设置单元格
	 * 
	 * @param index  列号
	 * @param value  单元格填充值
	 */
	public void setCell(int index, double value) {
		HSSFCell cell = this.row.createCell((short) index);
		// cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellStyle(style);
		cell.setCellValue(value);
	}

	/**
	 * 删除文件
	 * 
	 * @param filePathAndName 删除文件的路径+文件名
	 */
	public static void delFile(String filePathAndName) {
		try {
			String filePath = filePathAndName;
			filePath = filePath.toString();
			java.io.File myDelFile = new java.io.File(filePath);
			myDelFile.delete();

		} catch (Exception e) {
			System.out.println("删除文件操作出错");
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @param inputFileName 输入一个文件夹
	 * @param zipFileName 输出一个压缩文件夹,打包后文件名字
	 * @throws Exception
	 */
	public void zip(String inputFileName, String zipFileName) throws Exception {
		zip(zipFileName, new File(inputFileName));
	}

	private void zip(String zipFileName, File inputFile) throws Exception {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
				zipFileName));
		zip(out, inputFile, "");
		out.close();
	}

	private void zip(ZipOutputStream out, File f, String base) throws Exception {
		if (f.isDirectory()) { // 判断是否为目录
			File[] fl = f.listFiles();
			out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + fl[i].getName());
			}
		} else { // 压缩目录中的所有文件
			out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
			FileInputStream in = new FileInputStream(f);
			int b;
			System.out.println(base);
			while ((b = in.read()) != -1) {
				out.write(b);
			}
			in.close();
		}
	}

	/**
	 * 新建目录
	 * newFolder
	 * @param folderPath
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void newFolder(String folderPath) {
		String filePath = folderPath;
		filePath = filePath.toString();
		java.io.File myFilePath = new java.io.File(filePath);
		try {
			if (!myFilePath.isDirectory()) { //目录尚不存在
				myFilePath.mkdir();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

示例:

public class Test {
	/**
	 * 生成一个3行3列(不算标题行与列表头)的Excel文件 drawExcel
	 * 
	 * @author tf.li
	 * @data Sep 24, 2011
	 */
	public void drawExcel() {
		int row = 3;
		int col = 3;
		String filePath = "c:/报表/";
		String title = "统计表";
		XlsExport xlse = new XlsExport(title);
		
		 // 第一行,标题行
		xlse.createRow(0);
		for (int i = 0; i < 3; i++) { // 把这一行里的每个单元都填上,防止出现null
			xlse.setCell(i, "");
		}

		xlse.addMerge(0, (short) 0, 0, (short) 3); // 第一行合并单元格 ltf

		 // 第二行,放表头
		xlse.createRow(1);
		for (int i = 0; i < 3; i++) {
			xlse.setCell(i, "第"+(i+1)+"列");		}
		
		// 填入数据,开始画表
		for (row=0; row<3; row++) {
			xlse.createRow(row+2); //从第二行开始
			for(col=0; col<3; col++) {
				xlse.setCell(col, ((row+1)+","+(col+1)));
			}
		}

		for(int i=0; i<3; i++) {
			xlse.setAutoColumnWidth((short)i); //自动调整列宽度 ltf
		}

		xlse.getRow(0).getCell((short)0).setCellValue(filename); //标题要最后填上,防止把表格第一列宽度撑开ltf

		xlse.newFolder(filePath);

		xlse.exportXls(filePath + title + ".xls");
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值