最近做了导出excel文件的功能,在此记录一下我遇到的问题,并对方法进行了简单的封装.
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.ss.util.CellRangeAddress;
我粗略的封装了一下:
/***
*
* 创建使用说明的工作表
*
* @param wb:excel文件
* @param rowStart:合并单元格的下标,小于0表示不合并
* @param rowEnd
* @param colStart
* @param colEnd
* @param content:说明内容
*/
private void generatingSheetTemplate (HSSFWorkbook wb, int rowStart, int rowEnd, int colStart, int colEnd,String content,String sheetName)
{
HSSFSheet sheet1 = wb.createSheet (sheetName);
HSSFRow sheet1Row1 = sheet1.createRow (0);
HSSFCell sheet1Cell = sheet1Row1.createCell (0);
HSSFCellStyle cellStyle = wb.createCellStyle ();
// 设置样式自动换行,顶部垂直[配合/r/n强制换行]
cellStyle.setWrapText (true);
cellStyle.setVerticalAlignment (HSSFCellStyle.VERTICAL_TOP);
sheet1Cell.setCellStyle (cellStyle);
sheet1Cell.setCellValue (new HSSFRichTextString (content));//换行这里需要这个对象,否则强制换行不生效
// 合并单元格操作
if (rowStart >= 0 && rowEnd >= 0 && colStart >= 0 && colEnd >= 0)
{
sheet1.addMergedRegion (new CellRangeAddress (rowStart, rowEnd, colStart, colEnd));
}
}
上面例子生成代码(着重注意/r/n这是强制换行):
HSSFWorkbook wb = new HSSFWorkbook ();
String content = "模版使用说明:\r\n"
+ "1、父类元数据分类应该出现在子元数据分类之前\r\n"
+ "2、每元数据分类下的具体元数据存储在单独的书签中,其命名规则为“元数据-”加上"
+ "元数据分类的类别编码,如有以编码为“001”的元数据分类,那么其下面的具体元数据"
+ "应存储在命名为“元数据-001”的书签中,如果该编码为“001”的元数据分类有一个编码"
+ "为“000”的父级分类,则其下面的具体元数据应存储在命名"
+ "为“元数据-000.001”的书签中。\r\n"
+"3、“字段名”列:如果暂时不能确定该列值可留空、待定义数据集时再在界面上修改即可\r\n"
+"4、“标准代码标识”列:如果该元数据有标准代码则该列值为“1”否则为“0”;"
+ "并且如果有标准代码时“标准代码”列的值应该来自于《标准代码导入模板.xls》"
+ "中“标准代码描述”sheet页的“标准代码编码”列对应的值\r\n"
+ "5、“最小值”、“最大值”、“小数位”、“剂量单位”、“数据来源”列,如果"
+ "找不到对应的值,留空即可\r\n"
+ "6、元数据编码的格式:如果是国标或卫生部标准提供的元"
+ "数据请按相应的编码规则进行编码,否则按CF+大类编码+小类编码+流水号的形式保存";
String sheetName="模板使用声明";
// 生成模板说明工作表
generatingSheetTemplate (wb, 0, 24, 0, 11, content,sheetName);
/**
*
*
* 生成工作表(表头并设置其宽度)
*
* @param wb:excel文件
* @param heetName:工作表名称
* @param header:表头显示信息,及其宽度(LinkedHashMap确保其顺序)
* @return
*/
private HSSFSheet generatingSheetAtHeader (HSSFWorkbook wb, String sheetName,
LinkedHashMap header)
{
HSSFSheet sheet2 = wb.createSheet (sheetName);
HSSFRow sheet2HeaderRow = sheet2.createRow (0);
int index = 0;
for (Map.Entry entry : header.entrySet ())
{
String headerName = entry.getKey ();
Integer width = entry.getValue ();
sheet2.setColumnWidth (index, width);
HSSFCell sheet2cell = sheet2HeaderRow.createCell (index);
sheet2cell.setCellValue (headerName);
index++;
}
return sheet2;
}
例子的生成:
String sheetName = "数据元版本";
LinkedHashMap map1 = new LinkedHashMap ();
map1.put ("版本编码", Integer.valueOf (30 * 256));
map1.put ("版本名称", Integer.valueOf (30 * 256));
map1.put ("版本描述", Integer.valueOf (30 * 256));
HSSFSheet sheet1 = generatingSheetAtHeader (wb, sheetName, map1);
if (null != baseDataVersion)
{
HSSFRow sheet1Row2 = sheet1.createRow (1);
HSSFCell sheet1cell = sheet1Row2.createCell (0);
sheet1cell.setCellValue (baseDataVersion.getVersionCode ());
sheet1cell = sheet1Row2.createCell (1);
sheet1cell.setCellValue (baseDataVersion.getVersionName ());
sheet1cell = sheet1Row2.createCell (2);
sheet1cell.setCellValue (baseDataVersion.getVersionDes ());
}
1.换行问题(上面提过了)
2.工作表的命名问题:
工作表的命名不允许重复,且不区分大小写,如你的一个工作表的名称为A100,然而在这个excel文件中就不能创建a100的工作表了,更不要说在建一个A100,这会报错的,请注意!原因:WINDOWS系统一贯不区分大小写,文件也是这样的。