java poi导出数据为空,求解释

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java poi导出数据为空,求解释相关的知识,希望对你有一定的参考价值。

XSSFWorkbook xssfWorkbook = new XSSFWorkbook("D:\\落下的.xlsx");

XSSFWorkbook workbook = new XSSFWorkbook();
for(int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++)
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
XSSFSheet newSheet = workbook.createSheet(xssfSheet.getSheetName());
if(xssfSheet == null)
continue;

// 循环行Row
for(int rowNum = 0; rowNum <= xssfSheet.getPhysicalNumberOfRows(); rowNum++ )
XSSFRow xssfRow = xssfSheet.getRow( rowNum);
XSSFRow newRow = newSheet.createRow( rowNum);
if(xssfRow == null)
continue;

// 循环列Cell
for(int cellNum = 0; cellNum <= xssfRow.getPhysicalNumberOfCells(); cellNum++)
XSSFCell xssfCell = xssfRow.getCell(cellNum);
XSSFCell newCell = newRow.createCell(cellNum);
if(xssfCell == null)
continue;

if(xssfCell.getCellType()==0)
newCell.setCellValue(xssfCell.getNumericCellValue());
else
newCell.setCellValue(xssfCell.getStringCellValue());





System.out.println("*-------------");
System.out.println(workbook.getSheetAt(2).getPhysicalNumberOfRows());--这里打出有数据
String outPutx="E:\\23.xlsx";
FileOutputStream fOuts = new FileOutputStream(outPutx);
workbook.write(fOuts);--能得到工作表名字,但里面没数据
fOuts.flush();
fOuts.close();

我复制了你的代码去运行,运行了一下是有数据的,我就加了两个try catch

XSSFWorkbook xssfWorkbook=null;
try
xssfWorkbook = new XSSFWorkbook("C:\\Users\\Administrator.user-THINK\\Desktop\\医学影像报告统计.xlsx");
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();


XSSFWorkbook workbook = new XSSFWorkbook();
for(int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++)
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
XSSFSheet newSheet = workbook.createSheet(xssfSheet.getSheetName());
if(xssfSheet == null)
continue;

// 循环行Row
for(int rowNum = 0; rowNum <= xssfSheet.getPhysicalNumberOfRows(); rowNum++ )
XSSFRow xssfRow = xssfSheet.getRow( rowNum);
XSSFRow newRow = newSheet.createRow( rowNum);
if(xssfRow == null)
continue;

// 循环列Cell
for(int cellNum = 0; cellNum <= xssfRow.getPhysicalNumberOfCells(); cellNum++)
XSSFCell xssfCell = xssfRow.getCell(cellNum);
XSSFCell newCell = newRow.createCell(cellNum);
if(xssfCell == null)
continue;

if(xssfCell.getCellType()==0)
newCell.setCellValue(xssfCell.getNumericCellValue());
else
newCell.setCellValue(xssfCell.getStringCellValue());





System.out.println("*-------------");
System.out.println(workbook.getSheetAt(0).getPhysicalNumberOfRows());//这里打出有数据
String outPutx="C:\\Users\\Administrator.user-THINK\\Desktop\\医学影像报告统计2.xlsx";
FileOutputStream fOuts=null;
try
fOuts = new FileOutputStream(outPutx);
workbook.write(fOuts);//能得到工作表名字,但里面没数据
fOuts.flush();
fOuts.close();
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
追问

实在不明白为什么我的只把工作表的名字输入进去了,但是却没有数据,能解释下是哪里出问题了吗

追答

你把我的代码复制过去试试

参考技术A 我直接拿你的代码发现没有问题.唯一可能出问题的地方就是
if(xssfCell.getCellType()==0)
newCell.setCellValue(xssfCell.getNumericCellValue());
else
newCell.setCellValue(xssfCell.getStringCellValue());

可能你的数据的数据格式有问题..你再重新弄一个excel 里面输入一些普通的数据 应该没有问题的..
还有你用的是XSSF 所以只支持07以上的版本 ..就是扩展名字为xlsx的...追问

数据格式检查过了 没问题。在debug中能看那所有数据,但是workbook.write(fOuts);输出后只有工作表的名字了

追答

但是我用你的代码运行了下.是有数据的 没有任何问题的啊...你是不是运行当中那个23.xlsx是打开的?

参考技术B 你都没发现一个问题么?你的workbook除了最开始new 了次,最后就是write(fOuts)。
你设置值的单元格都是通过xssfWorkbook来创建的。

给你个例子吧。
public static void writeExcel(String path,String[] titles,List list) throws IllegalArgumentException, IllegalAccessException, IOException
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("test");

if (null != titles)
HSSFRow titleRow = sheet.createRow(0);
for (int i=0;i<titles.length;i++)
HSSFCell titleCell = titleRow.createCell((short) i);
titleCell.setCellValue(titles[i]);


Object val = null;
if (null != list)
for (int i=0;i<list.size();i++)
HSSFRow row = sheet.createRow((i+1));
Object obj = list.get(i);
Field[] fields = obj.getClass().getDeclaredFields();

for (int j=0;j<fields.length;j++)
Field field = fields[j];
field.setAccessible(true);
Class type = field.getType();

if ("double".equals(type.toString()) || "class java.lang.Double".equals(type.toString()))
double d = field.getDouble(obj);
System.out.println(d);
val = new Double(d);

else if("int".equals(type.toString()) || "class java.lang.Integer".equals(type.toString()))
int iV = field.getInt(obj);
val = iV;

else if("boolean".equals(type.toString()) || "class java.lang.Boolean".equals(type.toString()))
boolean b = field.getBoolean(obj);
val = b;

else if ("class java.util.Date".equals(type.toString()))
Date date = (Date) field.get(obj);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
val = sdf.format(date);

else
val = field.get(obj);


HSSFCell cell = row.createCell((short) j);
cell.setCellValue(val.toString());




FileOutputStream out = new FileOutputStream(path);
workbook.write(out);
追问

XSSFSheet newSheet = workbook.createSheet(xssfSheet.getSheetName());这里用的是workbook啊,而且你的例子有点乱

参考技术C 数据没写进去追问

workbook里面已近有数据了 workbook.write(fOuts);打开文件有工作表名字,但里面没数据。我想知道什么原因

以上是关于java poi导出数据为空,求解释的主要内容,如果未能解决你的问题,请参考以下文章

java大概1000W数据导出成excel有啥好的建议。(最好是插件,POI、JXL、FastExcel已试过,数据量太大,不

Java poi导出Excel,小数点后面数据缺失

java工厂类 poi导出

急!!!java用poi导出excel文件,打开导出的文件时报错“文件错误,数据可能丢失”

java poi导出excel

求问 java poi 导出多个sheet页