java-无法使用Apache POI读取Excel 2010文件.第一行编号为-1
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-无法使用Apache POI读取Excel 2010文件.第一行编号为-1,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3266字,纯文字阅读大概需要5分钟。
内容图文
我正在使用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-无法使用Apache POI读取Excel 2010文件.第一行编号为-1全部内容,希望文章能够帮你解决java-无法使用Apache POI读取Excel 2010文件.第一行编号为-1所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。