Testfile.xlsx создается с помощью «SpreadsheetGear 7.1.1.120». Откройте файл XLSX с помощью программного обеспечения, которое может работать с ZIP-архивами, и просмотрите /xl/workbook.xml
, чтобы увидеть это. В файлах worksheets/sheet?.xml
следует заметить, что все элементы строки не имеют номеров строк. Если я помещу номер строки в первый тег строки, например <row r="1">
, тогда POI apache сможет прочитать эту строку.
Если говорить о том, кто в этом виноват, то однозначно и Apache Poi, и SpreadsheetGear ;-). Apache POI, потому что атрибут r
в элементе row
является необязательным. Но SpreadsheetGear еще и потому, что нет причин не использовать атрибут r
, если сам Excel когда-либо это делает.
Если вы не можете получить файл testfile.xlsx в формате, который Apache POI может считывать напрямую, вам придется работать с базовыми объектами. Следующее работает с вашим 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 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 напрямую, так как он имеет защищенный доступ.
person
Axel Richter
schedule
28.11.2014
<row r="1">
, тогда POI apache сможет прочитать эту строку. - person Axel Richter   schedule 27.11.2014