无效行号 (65536) 超出允许范围 (0..65535)

问题描述 投票:0回答:6

我正在从文本文件中读取整数,将它们作为查询的输入并获取查询输出并写入 xls 文件。

ResultSet rs;
Connection con = null;
PreparedStatement ps = null;
int person_org_id, external_person_org_id;
File f = null;
Scanner scan = null;

try {
    System.out.println("----------checkpoint-----------");
    Class.forName("oracle.jdbc.driver.OracleDriver");
    System.out.println("----------checkpoint 1-----------");
    con = DriverManager.getConnection("jdbc:oracle:thin:@ksdjf.kjdlk.jkd.com:2222:edb", "aaaaa", "aaaa");
    System.out.println("----------checkpoint 2 ----------");
    if (con == null) {
        System.out.println("unable to connect to database");
    }
    System.out.println("----------checkpoint 3::connected to database---------");
    StringBuffer sql = new StringBuffer();
    sql.append("select abd from edb.abd where customer_id=510 and person_org_id =? ");
    ps = con.prepareStatement(sql.toString());

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("Excel Sheet");
    HSSFRow rowhead = sheet.createRow(0);
    rowhead.createCell(0).setCellValue("ABC");
    rowhead.createCell(1).setCellValue("DEF");

    f = new File("/tmp/contacts.txt");
    scan = new Scanner(f);
    int index=1;

    while (scan.hasNextInt()) {

        person_org_id = scan.nextInt();

        ps.setInt(1,person_org_id);
        rs= ps.executeQuery();

        while (rs.next()) {                 

            external_person_org_id = rs.getInt(1);

            HSSFRow row = sheet.createRow(index);
            row.createCell(0).setCellValue(person_org_id);
            row.createCell(1).setCellValue(external_person_org_id);
            index++;
        }           

    }   
    FileOutputStream fileOut = new FileOutputStream(new File("/tmp/External_contact_id.xls"));
    wb.write(fileOut);
    fileOut.close();
    System.out.println("--------checkpoint 4:: writing data to xls completed------------");
}
catch (Exception e) {
    System.out.println(e.getMessage());
}

我收到错误

Invalid row number (65536) outside allowable range (0..65535)

我的

contacts.txt
文件有大约36000个号码。

java file-io xls
6个回答
45
投票

HSSF 针对 Excel 版本 (Excel 2003),最多仅支持 65536 行。

您可以尝试使用较新的 XSSF API,它支持更高版本的 Excel,具有更宽松的行限制。

有一个转换指南,它将帮助您在两个 API 之间进行转换。


2
投票

如果文本文件中只有 36000 个项目,则一定有其他问题。

创建一个小样本,比如说 100 个条目,然后进行测试。

如果可以的话,请仔细查看生成的 Excel 文件。看来以下代码是您的问题:

while(rs.next()){                   

        external_person_org_id = rs.getInt(1);

        HSSFRow row = sheet.createRow(index);
            row.createCell(0).setCellValue(person_org_id);
            row.createCell(1).setCellValue(external_person_org_id);
            index++;
        }       

我只是猜测,但是索引++位于WHILE中的事实不会导致它每次为记录集中的每个条目创建一个新行吗?


1
投票

Excel(也许只有旧版本)只允许 65535 行。

这里有一个指向 Excel 2003 限制的链接,它确实是 65535 行。 2010 年增加至 1,048,576


0
投票
int person_org_id, external_person_org_id;

你需要将 int 变量更改为 Integer,原始变量有限制,不能超过

-32767
32767


0
投票
<h:commandButton styleClass="dataExporter"
  value="#{o:translate('Export As Excel')}" style="margin-left:5px">
    <p:dataExporter type="**xls**" target="deviceAuditTable" fileName="DeviceAudit"/>
</h:commandButton>

当您使用

new HSSFWorkbook()
new XSSFWorkbook()
,并从方法调用中删除对 HSSF 的引用并确保文件扩展名时,对于此处的
new XSSFWorkBook()
,文件类型为 xlsx

<h:commandButton styleClass="dataExporter"
                            value="#{o:translate('Export As Excel')}" style="margin-left:5px">
    <p:dataExporter type="xlsx" target="deviceAuditTable"
                                fileName="DeviceAudit" />
</h:commandButton>

0
投票

原因是 XLS 限制,您需要更改为 XLSX,它给您的不是 65 535 行,而是 1 048 576 行。

所需步骤

  1. 您需要将 HSSFWorkbook() 更改为 XSSFWorkbook()。 H -> X

  2. 将文件扩展名从 xls 更改为 xlsx

  3. 将库版本升级到最新版本 https://mvnrepository.com/artifact/org.apache.poi/poi

     <!-- xlsx lib -->
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>5.2.5</version>
     </dependency>
     <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>5.2.5</version>
     </dependency>
    

代码示例:

    Workbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Report");
    Row header = sheet.createRow(0);
    int cellNum = 0;

    List<String> headers = Arrays.asList("Lp.", "System", "Col2");
    for (String headerText : headers) {
        header.createCell(cellNum++).setCellValue(headerText);
    }

完整示例: https://howtodoinjava.com/java/library/readingwriting-excel-files-in-java-poi-tutorial/

© www.soinside.com 2019 - 2024. All rights reserved.