基础数据导出信息类
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);