Java 使用POI将不同的数据类型写入excel

Java 使用POI将不同的数据类型写入excel,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试将数据从数据库导出到Excel。我已将数据导出并当前存储在ArrayList中(这可以更改)。我已经能够将数据导出到excel,但所有值都被导出为字符串,我需要它们保持其数据类型,即货币/数字 我正在使用ApachePOI,很难将字段的数据类型设置为字符串以外的任何类型。我错过什么了吗?有人能告诉我一个更好的方法吗?在此方面的任何帮助都将不胜感激 publicstaticvoidimportdatatoexcel(字符串sheetName、ArrayList头、ArrayList数据、

我正在尝试将数据从数据库导出到Excel。我已将数据导出并当前存储在ArrayList中(这可以更改)。我已经能够将数据导出到excel,但所有值都被导出为字符串,我需要它们保持其数据类型,即货币/数字

我正在使用ApachePOI,很难将字段的数据类型设置为字符串以外的任何类型。我错过什么了吗?有人能告诉我一个更好的方法吗?在此方面的任何帮助都将不胜感激

publicstaticvoidimportdatatoexcel(字符串sheetName、ArrayList头、ArrayList数据、文件xlsFilename、int sheetNumber)
抛出HPSFException、FileNotFoundException、IOException{
POIFSFileSystem fs=新的POIFSFileSystem();
HSSFWorkbook wb=新的HSSFWorkbook(新文件输入流(xlsFilename));
HSSFSheet sheet=wb.createSheet(sheetName);
int rowIdx=0;
短细胞idx=0;
//标题
HSSFRow hssfHeader=sheet.createRow(rowIdx);
HSSFCellStyle cellStyle=wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.Alignment_CENTER);
for(迭代器单元格=header.Iterator();cells.hasNext();){
HSSFCell HSSFCell=hssfHeader.createCell(cellIdx++);
hssfCell.setCellStyle(cellStyle);
hssfCell.setCellValue((字符串)cells.next());
}
//资料
rowIdx=1;
for(Iterator rows=data.Iterator();rows.hasNext();){
ArrayList row=(ArrayList)rows.next();
HSSFRow HSSFRow=(HSSFRow)sheet.createRow(rowIdx++);
cellIdx=0;
for(迭代器单元格=行。迭代器();单元格。hasNext();){
HSSFCell HSSFCell=hssfRow.createCell(cellIdx++);
hssfCell.setCellValue((字符串)cells.next());
}
}
Logfile.log(“sheetNumber=“+sheetNumber”);
wb.setSheetName(图纸编号、图纸名称);
试一试{
FileOutputStream out=新的FileOutputStream(xlsFilename);
wb.写(出);
out.close();
}捕获(IOE异常){
抛出新的HPSFException(例如getMessage());
}
}

在进行强制转换之前,您需要检查单元格值的类别:

publicstaticvoidimportdatatoexcel(字符串sheetName、列表标题、列表数据、文件xlsFilename、int sheetNumber)
抛出HPSFException、FileNotFoundException、IOException{
POIFSFileSystem fs=新的POIFSFileSystem();
工作手册wb;
试一试{
wb=WorkbookFactory.create(新文件输入流(xlsFilename));
}捕获(无效格式异常){
抛出新IOException(“无效工作簿格式”);
}
图纸=wb.createSheet(图纸名称);
int rowIdx=0;
int-cellIdx=0;
//标题
行hssfHeader=sheet.createRow(rowIdx);
CellStyle CellStyle=wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.Alignment_CENTER);
for(最终字符串标题:标题){
Cell hssfCell=hssfHeader.createCell(cellIdx++);
hssfCell.setCellStyle(cellStyle);
hssfCell.setCellValue(表头);
}
//资料
rowIdx=1;
对于(最终列表行:数据){
行hssfRow=sheet.createRow(rowIdx++);
cellIdx=0;
用于(对象值:行){
Cell hssfCell=hssfRow.createCell(cellIdx++);
if(字符串的值实例){
hssfCell.setCellValue((字符串)值);
}else if(数值实例){
hssfCell.setCellValue(((数字)值).doubleValue());
}否则{
抛出新的RuntimeException(“无效类型的单元格值”+值);
}
}
}
wb.setSheetName(图纸编号、图纸名称);
试一试{
FileOutputStream out=新的FileOutputStream(xlsFilename);
wb.写(出);
out.close();
}捕获(IOE异常){
抛出新的HPSFException(例如getMessage());
}
}

我还添加了泛型-这使代码更具可读性。此外,您还需要尽可能避免使用实际的
,并使用
接口
,例如
列表
数组列表
HSSFRow

您在
列表
中放了什么?它们都是原始的-如何填充它们?为什么不将字符串解析为数字,并使用双精度键调用
setCellValue
?列表是从数据库查询返回的结果。标题列表只是字符串,数据列表是双精度和字符串的组合。它看起来不像您在这里对
String
的转换
hssfCell.setCellValue((String)cells.next())-这意味着它是所有字符串。否则您将看到
ClassCastException
s。很抱歉,您是对的,我最初仅为String设置了此选项,但现在我正在尝试让它写出double。我不知道如何才能获得值的数据类型,以便能够解析不同的结果。对不起,我已经看了这几天了,我已经尝试了很多方法来纠正它。非常感谢你的帮助-这正是我这几天一直在尝试的。再次感谢您,祝您周末愉快。