封装POI读取导出Excel

基础数据导出信息类

 

 

import java.util.List;

public class BaseDataExportInfo {
  private String sheetTitle; //工作表标题

  private String sheetName; //工作表名称

  private String workbookFileName; //文件名

  private short sheetIndex = (short)0; //创建工作表的顺序
  private List tableHead; //表头
  private List rowList; //行 Vector v = new Vector(); v.add(i, "");data.add(v);
  private String cellDataFomat; //设置单元格类型,值请参考HSSFDataFormat内置的数据类型,例如"@"代表文本
  public List getRowList() {
    return rowList;
  }

  public void setRowList(List rowList) {
    this.rowList = rowList;
  }

  public String getSheetName() {
    return sheetName;
  }

  public void setSheetName(String sheetName) {
    this.sheetName = sheetName;
  }

  public String getSheetTitle() {
    return sheetTitle;
  }

  public void setSheetTitle(String sheetTitle) {
    this.sheetTitle = sheetTitle;
  }

  public List getTableHead() {
    return tableHead;
  }

  public void setTableHead(List tableHead) {
    this.tableHead = tableHead;
  }

  public String getWorkbookFileName() {
    return workbookFileName;
  }

  public void setWorkbookFileName(String workbookFileName) {
    this.workbookFileName = workbookFileName;
  }

  public short getSheetIndex() {
    return sheetIndex;
  }

  public void setSheetIndex(short sheetIndex) {
    this.sheetIndex = sheetIndex;
  }

public String getCellDataFomat() {
	return cellDataFomat;
}

public void setCellDataFomat(String cellDataFomat) {
	this.cellDataFomat = cellDataFomat;
}

}

  

处理类

 

import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
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;

public class ProcessXSL {
	HSSFWorkbook wb = new HSSFWorkbook();
	String workbookFileName = "test.xls";
	protected final Log log = LogFactory.getLog(getClass());

	public ProcessXSL() {
	}

	/**
	 * 创建 Execl 文件
	 * 
	 * @param wb
	 *            HSSFWorkbook
	 * @param exportInfo
	 *            BaseDataExportInfo
	 */
	public void createWorkBookSheet(BaseDataExportInfo exportInfo) {

		Vector cellList = null;
		if (exportInfo.getWorkbookFileName() != null)
			workbookFileName = exportInfo.getWorkbookFileName() + ".xls";
		try {

			HSSFSheet sheet = wb.createSheet(exportInfo.getSheetIndex() + "");
			wb.setSheetName(exportInfo.getSheetIndex(), exportInfo
					.getSheetName(), (short) 1);

			/** 设置列宽 */

			for (int i = 0; i < exportInfo.getTableHead().size(); i++) {
				if (i == 1 || i == exportInfo.getTableHead().size() - 1) {
					sheet.setColumnWidth((short) i, (short) 7000);
				} else {
					sheet.setColumnWidth((short) i, (short) 4000);
				}
			}

			/** 合并单元格 */
			sheet.addMergedRegion(new Region(0, (short) 0, 0,
					(short) (exportInfo.getTableHead().size() - 1)));

			/** 表 标题 */
			HSSFRow row = sheet.createRow((short) 0);
			row.setHeight((short) 500); // 设置行高

			HSSFFont titleFont = wb.createFont();
			titleFont.setFontName("宋体");
			titleFont.setFontHeightInPoints((short) 16);
			titleFont.setBoldweight((short) 20);
			HSSFCellStyle titleStyle = wb.createCellStyle();
			titleStyle.setFont(titleFont);

			titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); // 居中

			row = this.createCell(row, (short) 0, titleStyle, exportInfo
					.getSheetTitle());

			/** 表头 */
			HSSFFont headFont = wb.createFont();
			headFont.setFontName("宋体");
			headFont.setFontHeightInPoints((short) 12);
			headFont.setBoldweight((short) 20);

			HSSFCellStyle headStyle = wb.createCellStyle();
			headStyle.setFont(headFont);
			headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框

			headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 左边框

			headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 右边框

			headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 上边框

			headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

			HSSFRow row2 = sheet.createRow((short) 1);
			row2.setHeight((short) 400); // 设置行高

			for (int i = 0; i < exportInfo.getTableHead().size(); i++) {
				row2 = this.createCell(row2, (short) i, headStyle, exportInfo
						.getTableHead().get(i));
			}
			/** 表体 */
			HSSFFont font = wb.createFont();
			/** 设置字体样式 */
			font.setFontName("宋体");
			HSSFCellStyle cellStyle = wb.createCellStyle();
			if (exportInfo.getCellDataFomat() != null
					&& !"".equals(exportInfo.getCellDataFomat())) {
				short stringFormat = HSSFDataFormat.getBuiltinFormat(exportInfo
						.getCellDataFomat());
				if (stringFormat != -1) {
					cellStyle.setDataFormat(stringFormat);
				}
			}
			cellStyle.setFont(font);
			cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框

			cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 左边框

			cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 右边框

			cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 上边框

			cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 居左

			for (int i = 0; i < exportInfo.getRowList().size(); i++) {
				cellList = (Vector) exportInfo.getRowList().get(i);
				HSSFRow row3 = sheet.createRow((short) i + 2);
				row3.setHeight((short) 300); // 设置行高
				for (int j = 0; j < cellList.size(); j++) {
					row3 = this.createCell(row3, (short) j, cellStyle, cellList
							.get(j));
				}
			}

		} catch (Exception ex) {
			log.info("error while create work book sheet ", ex);
		}

	}

	/**
	 * 创建 包含多个bookSheet 的 Execl 文件
	 * 
	 * @param wb
	 *            HSSFWorkbook
	 * @param exportInfo
	 *            BaseDataExportInfo
	 */
	public void createMoreWorkBookSheet(BaseDataExportInfo exportInfo) {

		if (exportInfo.getWorkbookFileName() != null)
			workbookFileName = exportInfo.getWorkbookFileName() + ".xls";
		try {

			for (int n = 0; n < exportInfo.getRowList().size(); n++) {

				// JOptionPane.showMessageDialog(null,"第" +(n+1)+ "分页!");

				HSSFSheet sheet = wb.createSheet(n + "");
				wb.setSheetName(n, exportInfo.getSheetName() + " " + (n + 1),
						(short) 1);

				/** 设置列宽 */
				// 设置第二列和倒数第二类的宽度为7000,其它列宽度为4000
				for (int i = 0; i < exportInfo.getTableHead().size(); i++) {
					if (i == 1 || i == exportInfo.getTableHead().size() - 1) {
						sheet.setColumnWidth((short) i, (short) 7000);
					} else {
						sheet.setColumnWidth((short) i, (short) 4000);
					}
				}

				/** 合并单元格 */
				// 生成标题行, Region的四个参数分别对应 (x1,y1,x2,y2)
				sheet.addMergedRegion(new Region(0, (short) 0, 0,
						(short) (exportInfo.getTableHead().size() - 1)));

				/** 表标题 */
				HSSFRow row = sheet.createRow((short) 0);
				row.setHeight((short) 500); // 设置行高

				// 格式化表标题
				HSSFFont titleFont = wb.createFont();
				titleFont.setFontName("宋体");
				titleFont.setFontHeightInPoints((short) 16);
				titleFont.setBoldweight((short) 20);
				HSSFCellStyle titleStyle = wb.createCellStyle();
				titleStyle.setFont(titleFont);
				titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); // 居中

				row = this.createCell(row, (short) 0, titleStyle, exportInfo
						.getSheetTitle());

				/** 表头 */
				// 格式化表头
				HSSFFont headFont = wb.createFont();
				headFont.setFontName("宋体");
				headFont.setFontHeightInPoints((short) 12);
				headFont.setBoldweight((short) 20);

				HSSFCellStyle headStyle = wb.createCellStyle();
				headStyle.setFont(headFont);
				headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框

				headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 左边框

				headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 右边框

				headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 上边框

				headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

				HSSFRow row2 = sheet.createRow((short) 1);
				row2.setHeight((short) 400); // 设置行高

				for (int i = 0; i < exportInfo.getTableHead().size(); i++) {
					row2 = this.createCell(row2, (short) i, headStyle,
							exportInfo.getTableHead().get(i));
				}

				/** 表体 */
				// 格式化表体
				HSSFFont font = wb.createFont();
				font.setFontName("宋体");
				HSSFCellStyle cellStyle = wb.createCellStyle();
				if (exportInfo.getCellDataFomat() != null
						&& !"".equals(exportInfo.getCellDataFomat())) {
					short stringFormat = HSSFDataFormat
							.getBuiltinFormat(exportInfo.getCellDataFomat());
					if (stringFormat != -1) {
						cellStyle.setDataFormat(stringFormat);
					}
				}
				cellStyle.setFont(font);
				cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框

				cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 左边框

				cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 右边框

				cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 上边框

				cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 居左

				for (int i = 0; i < 98; i++) {
					if (i < exportInfo.getRowList().size()) {
						if ((i + n * 100) >= exportInfo.getRowList().size())
							break;

						Vector cellList = null;
						cellList = (Vector) exportInfo.getRowList().get(
								i + n * 100);
						HSSFRow row3 = sheet.createRow((short) i + 2);
						row3.setHeight((short) 300); // 设置行高
						for (int j = 0; j < cellList.size(); j++) {
							row3 = this.createCell(row3, (short) j, cellStyle,
									cellList.get(j));
						}

					}
				}

				if ((100 * (n + 1) - 1) >= exportInfo.getRowList().size())
					break;
			}
		} catch (Exception ex) {
			log.info("error while create work book sheet ", ex);
		}

	}

	/**
	 * 创建单元格
	 * 
	 * 
	 * @param row
	 *            HSSFRow
	 * @param cellIndex
	 *            short
	 * @param cellStyle
	 *            HSSFCellStyle
	 * @param cellValue
	 *            Object
	 * @return HSSFRow
	 */
	public HSSFRow createCell(HSSFRow row, short cellIndex,
			HSSFCellStyle cellStyle, Object cellValue) {
		HSSFCell cell = row.createCell((short) cellIndex);
		try {
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			if (cellStyle != null) {
				cell.setCellStyle(cellStyle);
			}

			if (cellValue == null) {
				cell.setCellValue("");
			} else if (cellValue instanceof Boolean) {
				cell.setCellValue(((Boolean) cellValue).booleanValue());
			} else if (cellValue instanceof String) {
				cell.setCellValue((String.valueOf(cellValue)));
			} else if (cellValue instanceof Date) {
				cell.setCellValue((Date) cellValue);
			} else {
				cell.setCellValue("");
			}

			// log.info("this cell value is " + cellValue);
		} catch (Exception ex) {
			log.error("error while execut create cell ", ex);
		}
		return row;
	}

	/**
	 * 读取Excel 表
	 * 
	 * 
	 * @param aSheet
	 *            HSSFSheet
	 * @throws Exception
	 * @return List
	 */
	public List readWeekBookSheet(HSSFSheet aSheet) throws Exception {
		List rowList = new ArrayList();
		Vector rowVector = null;
		int rowNum = 1;
		int cellNum = 1;
		int maxCellNum = aSheet.getRow(1).getLastCellNum();
		try {
			for (int rowNumOfSheet = 2; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
				rowNum = rowNumOfSheet;
				if (null != aSheet.getRow(rowNumOfSheet)) {
					HSSFRow aRow = aSheet.getRow(rowNumOfSheet);
					rowVector = new Vector();
					for (short cellNumOfRow = 0; cellNumOfRow <= maxCellNum; cellNumOfRow++) {
						cellNum = cellNumOfRow;
						if (null != aRow.getCell(cellNumOfRow)) {
							HSSFCell aCell = aRow.getCell(cellNumOfRow);
							int cellType = aCell.getCellType();

							switch (cellType) {
							case HSSFCell.CELL_TYPE_NUMERIC: // 整形

								// rowVector.add(cellNumOfRow,
								// String.valueOf(aCell.getNumericCellValue())
								// .substring(0,
								// String.valueOf(aCell.getNumericCellValue()).indexOf(".")));
								rowVector.add(cellNumOfRow, String
										.valueOf(aCell.getNumericCellValue()));
								break;
							case HSSFCell.CELL_TYPE_STRING: // 字符串型
								rowVector.add(cellNumOfRow, aCell
										.getStringCellValue().trim());
								break;
							case HSSFCell.CELL_TYPE_FORMULA: // double 型

								rowVector.add(cellNumOfRow, String
										.valueOf(aCell.getNumericCellValue()));
								break;
							case HSSFCell.CELL_TYPE_BLANK: // 空字符

								rowVector.add(cellNumOfRow, "");
								break;
							case HSSFCell.CELL_TYPE_BOOLEAN: // 布尔型

								rowVector.add(cellNumOfRow, String
										.valueOf(aCell.getBooleanCellValue()));
								break;
							default:
								rowVector.add(cellNumOfRow, "");
							}
						} else {
							rowVector.add(cellNumOfRow, "");
						}
					}
					rowList.add(rowVector);
				}
			}

		} catch (Exception ex) {
			log.error("error while execut read week book sheet with " + rowNum
					+ " rows and " + cellNum + "cols", ex);
			throw new Exception();
		}

		return rowList;
	}

	/**
	 * 写Execl 文件
	 * 
	 * @param wb
	 *            HSSFWorkbook
	 * @param outPutStream
	 *            OutputStream
	 */
	public void writeWorkBook(HttpServletResponse response) {
		try {

			OutputStream outputStream = new BufferedOutputStream(response
					.getOutputStream());
			response.reset();
			response.setContentType("application/vnd.ms-excel");
			response.setHeader("content-disposition", "attachment;filename=\""
					+ new String(workbookFileName.getBytes(), response
							.getCharacterEncoding()) + "\"");
			wb.write(outputStream);
			outputStream.close();
		} catch (Exception ex) {
			log.error("error while create work book ", ex);
		}

	}
}

 

使用说明

service方法:

public BaseDataExportInfo getOpeXls(SplitPageHelpBean page) {
		TimeKit date = new TimeKit();
		BaseDataExportInfo export = new BaseDataExportInfo();
		export.setWorkbookFileName(date.now("short"));
		export.setSheetTitle("从业资格证-" + date.now("long"));
		export.setSheetName("从业资格证");
		List tableHead = new ArrayList();
		tableHead.add("编号");
		tableHead.add("资格证号");
		tableHead.add("姓名");
		tableHead.add("身份证号");
		tableHead.add("性别");
		tableHead.add("出生日期");
		tableHead.add("办证日期");
		export.setTableHead(tableHead);

		List rowList = new ArrayList();
		List zgzList = page.getContent();
		if (page != null) {
			for (int j = 0; j < zgzList.size(); j++) {
				Vector cols = new Vector();
				cols.add(0, String.valueOf(j+1));
				cols.add(1, ((TippstjjTJZGZ) zgzList.get(j)).getZgzNum());
				cols.add(2, ((TippstjjTJZGZ) zgzList.get(j)).getZgzName());
				cols.add(3, ((TippstjjTJZGZ) zgzList.get(j)).getZgzSfzNum());
				cols.add(4, ((TippstjjTJZGZ) zgzList.get(j)).getZgzSex());
				cols.add(5, ((TippstjjTJZGZ) zgzList.get(j)).getZgzBirthday()==null?"":TimeKit.formatDate(((TippstjjTJZGZ) zgzList.get(j)).getZgzBirthday(), "short"));
				cols.add(6, ((TippstjjTJZGZ) zgzList.get(j)).getZgzDate()==null?"":TimeKit.formatDate(((TippstjjTJZGZ) zgzList.get(j)).getZgzDate(), "short"));
				// cols.add(4, ( (TippstjjTJZGZ)
				// zgzList.get(j)).getOpeTime()==null?"":((TippBaseOpelog)
				// opeLogs.get(j)).getOpeTime().toString());
				rowList.add(cols);
			}
		}
		export.setRowList(rowList);

		return export;
	} 

 在Action中调用上边写的service的方法

public ActionForward onSubmit(ActionMapping mapping, Object bean,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		ZgzForm form=(ZgzForm)getForm();
		String name=form.getZgzName();//姓名
		String zgzNum=form.getZgzNum();//资格证号
		String sfzNum=form.getZgzSfzNum();//身份证号
		String birthday=form.getZgzBirthday();//生日
		String sex=form.getZgzSex();//性别
		String zgzDate=form.getZgzDate();//发证日期
		
		ArrayList list=new ArrayList();
		String sql=" 1=1";
		//对用户条件进行判断
		if(name!=null&&!"".equals(name)){
			sql=sql+" and {zgzName}=? ";
			list.add(name);
		}
		if(zgzNum!=null&&!"".equals(zgzNum)){
			sql=sql+" and {zgzNum}=? ";
			list.add(zgzNum);
		}
		if(sfzNum!=null&&!"".equals(sfzNum)){
			sql=sql+" and {zgzSfzNum}=? ";
			list.add(sfzNum);
		}
		if(birthday!=null&&!"".equals(birthday)){
			sql=sql+" and {zgzBirthday}=? ";
			list.add(birthday);
		}
		if(sex!=null&&!"".equals(sex)){
			sql=sql+" and {zgzSex}=? ";
			list.add(sex);
		}
		if(zgzDate!=null&&!"".equals(zgzDate)){
			sql=sql+" and {zgzDate}=? ";
			list.add(zgzDate);
		}

		sql=sql+" order by {zgzDate} desc";
		
		//创建分页对象
		SplitPageHelpBean page=new SplitPageHelpBean();
		//获取当前页数
	    int currentPage = form.getCurrentPage();
	    if (currentPage == 0) {
	      currentPage = 1;
	    }
		page.setRecordsPerPage(99999);
		page.setCurrentPage(currentPage);
		page.setQueryString(sql);
		page.setValues(list.toArray());
		page=stjjService.getObjects(TippstjjTJZGZ.class,page);
		request.setAttribute("splitPage", page);
		
		BaseDataExportInfo export = null;
		export = stjjService.getOpeXls(page);
		export.setCellDataFomat("@");//设置单元格类型,值请参考HSSFDataFormat内置的数据类型,例如"@"代表文本
		ProcessXSL xsl = new ProcessXSL();
		xsl.createWorkBookSheet(export);
		xsl.writeWorkBook(response);
		return null;
	}

 参考资料

 HSSFDataFormat的数据格式

 

内置数据类型

 

编号

 

"General"

 

0

 

"0"

 

1

 

"0.00"

 

2

 

"#,##0"

 

3

 

"#,##0.00"

 

4

 

"($#,##0_);($#,##0)"

 

5

 

"($#,##0_);[Red]($#,##0)"

 

6

 

"($#,##0.00);($#,##0.00)"

 

7

 

"($#,##0.00_);[Red]($#,##0.00)"

 

8

 

"0%"

 

9

 

"0.00%"

 

0xa

 

"0.00E+00"

 

0xb

 

"# ?/?"

 

0xc

 

"# ??/??"

 

0xd

 

"m/d/yy"

 

0xe

 

"d-mmm-yy"

 

0xf

 

"d-mmm"

 

0x10

 

"mmm-yy"

 

0x11

 

"h:mm AM/PM"

 

0x12

 

"h:mm:ss AM/PM"

 

0x13

 

"h:mm"

 

0x14

 

"h:mm:ss"

 

0x15

 

"m/d/yy h:mm"

 

0x16

 

保留为过国际化用

 

0x17 - 0x24

 

"(#,##0_);(#,##0)"

 

0x25

 

"(#,##0_);[Red](#,##0)"

 

0x26

 

"(#,##0.00_);(#,##0.00)"

 

0x27

 

"(#,##0.00_);[Red](#,##0.00)"

 

0x28

 

"_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"

 

0x29

 

"_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"

 

0x2a

 

"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"

 

0x2b

 

"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"

 

0x2c

 

"mm:ss"

 

0x2d

 

"[h]:mm:ss"

 

0x2e

 

"mm:ss.0"

 

0x2f

 

"##0.0E+0"

 

0x30

 

"@" - This is text format

 

0x31

在上面表中,字符串类型所对应的是数据格式为"@"(最后一行),也就是HSSFDataFormat中定义的值为0x31(49)的那行

 

记录一下遇到的问题

    问题一:excel格式问题,导出excel后,双击编辑单元格之后,若是长数字类型的内容会自动使用科学记数法表示,并且超出位数的部分会被截止

    解决办法:通过POI设置单元格格式为文本就能解决问题,网上查了一下,一般都是说通过cell.setCellType(HSSFCell.CELL_TYPE_STRING)设置单元格格式,但通过测试这种方法并不起作用,生成后的excel的单元格格式仍然是常规。下边介绍一种可以实现的方法,如下:

HSSFCellStyle cellStyle = wb.createCellStyle();
short stringFormat = HSSFDataFormat.getBuiltinFormat("@"); //请参考HSSFDataFormat内置的数据类型,例如"@"代表文本
cellStyle.setDataFormat(stringFormat); 

 

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值