您的位置:首页 > 其它

POI导出Excel

2015-09-02 11:43 453 查看
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

结构:

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。

如,生成这样一个Excel



// 1.声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 2.生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 3.设置表格默认宽度为15个字节
sheet.setDefaultColumnWidth(8);
// 4.生成一个样式
HSSFCellStyle styleRemark = workbook.createCellStyle();
// 设置这些样式
styleRemark.setAlignment(HSSFCellStyle.ALIGN_LEFT);
// 生成一个字体
HSSFFont fontRemark = workbook.createFont();
fontRemark.setFontHeightInPoints((short) 11);
fontRemark.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
fontRemark.setColor(HSSFColor.BLACK.index);
fontRemark.setFontName("宋体");
// 把字体 应用到当前样式
styleRemark.setFont(fontRemark);
// 5.产生表格标题行
HSSFRow rowTit = sheet.createRow(2);
HSSFCell cellTit = rowTit.createCell(0);
cellTit.setCellValue("请假记录");
cellTit.setCellStyle(styleTitle);
sheet.addMergedRegion(new Region(2, (short) 0, 2,
(short) (headerNames.length - 1)));//合并单元格
// 6.产生表格表头行
/*headerNames为一个存放表头内容的数组
String [] headerNames = {"月度","姓名","所属项目","人员性质","年休假","3天以内病假","3天到6个月病假","6个月以上病假","事假","婚假","丧假","产假","迟到早退","旷工","非法定节假日加班","国家法定节假日加班天数","倒休","事假扣款","请假汇总天数","备注"};
*/
HSSFRow row = sheet.createRow(3);
for (int i = 0; i < headerNames.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headerNames[i]);
System.out.println(text);
cell.setCellValue(text);
cell.setCellStyle(StyleFont(workbook, i + 1, 0));
}
// 7.遍历集合数据,产生数据行
/*dataSet为数据行内容
List<Ptleavesum> dataSet = new ArrayList<Ptleavesum>();
Ptleavesum pt = new Ptleavesum();
pt.setUsercode("7265");
……
*/
Iterator<T> it = dataSet.iterator();
int index = 3;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
// 利用反射机制,根据javabean属性的先后顺序,动态调用getX()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
/*在写这段代码时,出现了表头字段与数据行错位现象,即,数据没有放到对应的位置上,注意创建createCell与setCellValue不要放错值,这里用取到的属性值与表头去比较,如果一样就创建cell并把获得的属性值放进去。
这里headerIds存放的是与表头顺序一致的与get方法名称相同的数组,比如获取姓名,getUsername()所以存username
String [] headerNames = {"月度","姓名","所属项目","人员性质","年休假","3天以内病假","3天到6个月病假","6个月以上病假","事假","婚假","丧假","产假","迟到早退","旷工","非法定节假日加班","国家法定节假日加班天数","倒休","事假扣款","请假汇总天数","备注"};
String [] headerIds = {"yearmonth","username","projectcode","usertype","annualleave","thressickleave","sixmonthsick","uppersixmonthsick","businessleave","marriageleave","funeralleave","maternityleave","tardiness","truancy","overtime","legalovertime","timeoff","deduction","sumleave","remark"};
*/
for(int j=0;j<headerIds.length;j++){
if (fieldName.equals(headerIds[j])) {
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
System.out.println("getMethodName-----" + getMethodName);
System.out.println("headerIds==="+headerIds[j]);

Class tClass = t.getClass();
try {
Method getMethod = tClass.getMethod(getMethodName,new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
System.out.println("value================>" + value);
// 判断值类型后进行强制类型转换
String textValue = null;
if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(
pattern);
textValue = sdf.format(date);
} else {
if (value != null) {
textValue = value.toString();
} else {
textValue = "";
}
}
HSSFCell cell = row.createCell(j);
cell.setCellValue(textValue);
cell.setCellStyle(StyleFont(workbook, j + 1, 1));

} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
try {
//out:传过来的值OutputStream out = new FileOutputStream("F://月报表.xls");
workbook.write(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


ps:上面这段代码在一个Excel中只包含一个sheet的情况下没有问题,但当你想导出一个包含多个sheet的Excel时会出现,sheet创建不成功

// 创建sheet,workbook为共有一个,如下:
public void exportExcel(HSSFWorkbook workbook, int idx, String title,
Map<Integer, String> remarkMap, String[] headerNames,
String[] headerIds, Collection<T> dataSet, String filePath,
String pattern) {
// 记录行号
int rowNum = 0;
// 创建sheet
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(sheetIdx++, title);
……
……
//当向文件中写入时注意,不能向上边代码共用一个OutputStream,需要如下才能实现多sheet导出。
try {
OutputStream out = new FileOutputStream(filePath);
workbook.write(out);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: