Java Apache POI生成损坏的Excel文件
我正在使用ApachePOI在数据库的帮助下创建一个excel文件。我试着用不同的代码搜索了很多东西,结果得到的只是一次又一次损坏的excel表格。到目前为止,我使用的代码如下:Java Apache POI生成损坏的Excel文件,java,excel,apache-poi,jxl,Java,Excel,Apache Poi,Jxl,我正在使用ApachePOI在数据库的帮助下创建一个excel文件。我试着用不同的代码搜索了很多东西,结果得到的只是一次又一次损坏的excel表格。到目前为止,我使用的代码如下: public void generateExcel(ResultSet rs, String excelFilename, String newDesc){ try { Workbook wb = new XSSFWorkbook(); Cell c = null;
public void generateExcel(ResultSet rs, String excelFilename, String newDesc){
try {
Workbook wb = new XSSFWorkbook();
Cell c = null;
//Cell style for header row
CellStyle cs = wb.createCellStyle();
cs.setFillForegroundColor(IndexedColors.LIME.getIndex());
cs.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
Font f = wb.createFont();
f.setBoldweight(Font.BOLDWEIGHT_BOLD);
f.setFontHeightInPoints((short) 12);
cs.setFont(f);
//New Sheet
Sheet sheet1 = null;
sheet1 = wb.createSheet(newDesc);
ResultSetMetaData metaData = rs.getMetaData();
int colCount = metaData.getColumnCount();
//Create Hash Map of Field Definitions
LinkedHashMap<Integer, MyTableInfo> hashMap = new LinkedHashMap<Integer, MyTableInfo>(colCount);
for (int i = 0; i < colCount; i++) {
MyTableInfo db2TableInfo = new MyTableInfo();
db2TableInfo.setFieldName(metaData.getColumnName(i + 1).trim());
db2TableInfo.setFieldText(metaData.getColumnLabel(i + 1));
db2TableInfo.setFieldSize(metaData.getPrecision(i + 1));
db2TableInfo.setFieldDecimal(metaData.getScale(i + 1));
db2TableInfo.setFieldType(metaData.getColumnType(i + 1));
db2TableInfo.setCellStyle(getCellAttributes(wb, c, db2TableInfo));
hashMap.put(i, db2TableInfo);
}
// Row and column indexes
int idx = 0;
int idy = 0;
// Generate column headings
Row row = sheet1.createRow(idx);
MyTableInfo db2TableInfo = new MyTableInfo();
Iterator<Integer> iterator = hashMap.keySet().iterator();
while (iterator.hasNext()) {
Integer key = (Integer) iterator.next();
db2TableInfo = hashMap.get(key);
c = row.createCell(idy);
c.setCellValue(db2TableInfo.getFieldText());
c.setCellStyle(cs);
if(db2TableInfo.getFieldSize() > db2TableInfo.getFieldText().trim().length()){
sheet1.setColumnWidth(idy, (db2TableInfo.getFieldSize()* 500));
}
else {
sheet1.setColumnWidth(idy, (db2TableInfo.getFieldText().trim().length() * 500));
}
idy++;
}
while (rs.next()) {
idx++;
row = sheet1.createRow(idx);
System.out.println(idx);
for (int i = 0; i < colCount; i++) {
c = row.createCell(i);
db2TableInfo = hashMap.get(i);
switch (db2TableInfo.getFieldType()) {
case 1:
c.setCellValue(rs.getString(i+1));
break;
case 2:
c.setCellValue(rs.getDouble(i+1));
break;
case 3:
c.setCellValue(rs.getDouble(i+1));
break;
default:
c.setCellValue(rs.getString(i+1));
break;
}
c.setCellStyle(db2TableInfo.getCellStyle());
}
}
rs.close();
FileOutputStream fileOut = new FileOutputStream(excelFilename);
wb.write(fileOut);
fileOut.close();
}
catch (Exception e) {
System.out.println(e);
}
}
private static CellStyle getCellAttributes (Workbook wb, Cell c, MyTableInfo db2TableInfo){
CellStyle cs= wb.createCellStyle();
DataFormat df = wb.createDataFormat();
Font f = wb.createFont();
switch (db2TableInfo.getFieldDecimal()) {
case 1:
cs.setDataFormat(df.getFormat("#,##0.0"));
break;
case 2:
cs.setDataFormat(df.getFormat("#,##0.00"));
break;
case 3:
cs.setDataFormat(df.getFormat("#,##0.000"));
break;
case 4:
cs.setDataFormat(df.getFormat("#,##0.0000"));
break;
case 5:
cs.setDataFormat(df.getFormat("#,##0.00000"));
break;
default:
break;
}
cs.setFont(f);
return cs;
}
我以前使用JXL生成excel文件,但最近它也给了我同样的东西,因此我选择切换到apachepoi
提前感谢。您的HttpServletResponse设置正确吗? 您使用的文件扩展名是什么 试试这个:
ServletOutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"example.xls\"");
workbook = getWorkbook(....)
workbook.write(os);
workbook.close();
os.flush();
response.flushBuffer();
其中“response”是来自控制器方法的HttpServletResponse您在generateExcel中传递给wriiten的文件扩展名是什么?我使用xlsx extensionOk。您可以尝试工作簿=WorkbookFactory.create(文件),而不是工作簿=new XSSFWorkbook(fis);我看这里没有使用任何
FileInputStream
。正在正确创建工作簿@你能试着从代码中删除所有格式吗?这还包括列宽等。如果这根本没有帮助,那么尝试删除数据(创建一个包含1张工作表、1行和1个单元格的简单内容的空工作簿)。通过这种方式,我们可以看到问题究竟出在哪里,因为您有一个JSP,可以从中下载新生成的excel文件?在这种情况下,将excel文件保存在服务器上或运行JSP并从那里访问它的任何位置。也许只是你的下载方法没有正确实现,我使用的是xlsx扩展。另外,我没有使用HttpServletResponse。在这种情况下,我只调用一个java对象,方法generateExcel传递参数。我想知道如果我使用xls格式,getWorkBook会有什么功能。您可以使用工作簿或HSSFWorkbook作为.xls格式。工作簿是通用接口,适用于HSSF(.xls)和XSSF(.xlsx)。HSSF工作簿是.xls格式工作簿的实现。有关更多详细信息->
ServletOutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"example.xls\"");
workbook = getWorkbook(....)
workbook.write(os);
workbook.close();
os.flush();
response.flushBuffer();