java-无法使用Apache POI读取Excel 2010文件.第一行编号为-1
作者:互联网
我正在使用Apache POI API(当前版本3-10-FINAL)尝试使用testfile.以下测试代码
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelTest {
public static void main(String[] args) throws Exception {
String filename = "testfile.xlsx";
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filename));
XSSFSheet sheet = wb.getSheetAt(0);
System.out.println(sheet.getFirstRowNum());
}
}
导致第一行编号为-1(现有行返回为null).测试文件是由Excel 2010创建的(我对此部分没有控制权),可以在没有警告或问题的情况下使用Excel进行读取.如果使用我的Excel版本(2013)打开并保存文件,则可以按预期完美读取.
非常感谢我为什么无法读取原始文件或如何读取原始文件的任何提示.
解决方法:
使用“ SpreadsheetGear 7.1.1.120”创建testfile.xlsx.使用可以处理ZIP归档文件的软件打开XLSX文件,并查看/xl/workbook.xml进行查看.在worksheets / sheet?.xml文件中要注意,所有行元素都没有行号.如果我在第一个行标记中添加行号,例如< row r =“ 1”>然后apache POI可以读取此行.
如果是这个问题,谁来负责,那么答案肯定是Apache Poi和SpreadsheetGear ;-). Apache POI,因为row元素中的属性r是可选的.但是SpreadsheetGear还因为如果Excel本身曾经这样做,没有理由不使用r属性.
如果无法以可以直接读取Apache POI的格式获取testfile.xlsx,则必须使用基础对象.以下适用于您的testfile.xlsx:
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.InputStream;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
import java.util.List;
class Testfile {
public static void main(String[] args) {
try {
InputStream inp = new FileInputStream("testfile.xlsx");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
System.out.println(sheet.getFirstRowNum());
CTWorksheet ctWorksheet = ((XSSFSheet)sheet).getCTWorksheet();
CTSheetData ctSheetData = ctWorksheet.getSheetData();
List<CTRow> ctRowList = ctSheetData.getRowList();
Row row = null;
Cell[] cell = new Cell[2];
for (CTRow ctRow : ctRowList) {
row = new MyRow(ctRow, (XSSFSheet)sheet);
cell[0] = row.getCell(0);
cell[1] = row.getCell(1);
if (cell[0] != null && cell[1] != null && cell[0].toString() != "" && cell[1].toString() != "")
System.out.println(cell[0].toString()+"\t"+cell[1].toString());
}
} catch (InvalidFormatException ifex) {
} catch (FileNotFoundException fnfex) {
} catch (IOException ioex) {
}
}
}
class MyRow extends XSSFRow {
MyRow(org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow row, XSSFSheet sheet) {
super(row, sheet);
}
}
我用过
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet,
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData,
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow.
这是Apache POI Binary Distribution poi-bin-3.10.1-20140818的一部分,并且在poi-ooxml-schemas-3.10.1-20140818.jar中
有关文档,请参见http://grepcode.com/snapshot/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/
我已经扩展了XSSFRow,因为我们不能直接使用XSSFRow构造函数,因为它具有受保护的访问.
标签:java,excel,excel-2010,xssf,apache-poi 来源: https://codeday.me/bug/20191009/1882224.html