允许范围外的行号(-32768)无效(0..1048575)

时间:2014-05-19 09:18:12

标签: java apache-poi xlsx

我尝试使用Apache POI将报告导出为xlsx格式。以下是用于的代码。

public static void main(String[]args){
        try{
            XSSFWorkbook wb=new XSSFWorkbook();
            XSSFSheet sheet = wb.createSheet("new sheet");

            XSSFRow rowhead= sheet.createRow((short)0);
            rowhead.createCell((short) 0).setCellValue("column1");
            rowhead.createCell((short) 1).setCellValue("column2");
            rowhead.createCell((short) 2).setCellValue("column3");
            rowhead.createCell((short) 3).setCellValue("column4");
            rowhead.createCell((short) 4).setCellValue("column5");
                 System.out.println("im here");
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:...,....);
            Statement st=con.createStatement();         
            System.out.println("im here1");
            ResultSet rs=st.executeQuery("SELECT * FROM table3 ");
            System.out.println("im here2");         
            int i=1;
            while(rs.next()){
                XSSFRow row= sheet.createRow((short)i);
                row.createCell((short) 0).setCellValue(rs.getString("column1"));
                row.createCell((short) 1).setCellValue(rs.getString("column2"));
                row.createCell((short) 2).setCellValue(rs.getString("column3"));
                row.createCell((short) 3).setCellValue(rs.getString("column4"));
                row.createCell((short) 4).setCellValue(rs.getString("column5"));
                i++;
            }

            FileOutputStream fileOut = new FileOutputStream(new File("E:/report.xlsx"));
            wb.write(fileOut);
            fileOut.close();
            System.out.println("Your excel file has been generated!");


        } catch ( Exception ex ) {
            System.out.println(ex);

        }

总行数仅为200000.但在处理时,我收到无效行号错误。这是输出。

im here
im here1
im here2
java.lang.IllegalArgumentException: Invalid row number (-32768) outside allowable range (0..1048575)

4 个答案:

答案 0 :(得分:15)

一个short(你要投射到的)可以代表的最高值是32,767,之后它会回绕到-32768。

XSSFSheet.createRow需要int,因此您无需投射您的电话号码。

答案 1 :(得分:2)

VBA中的Integer类型只有16位长。 (我不骗你)。

因为它是签名类型,其范围是-32768到+32767。将32767递增1会导致回绕到最小的数字:这就是发生在您身上的事情。

改为使用Long类型:长度为32位。

答案 2 :(得分:0)

我相信你应该使用long而不是int。

答案 3 :(得分:0)

Ehlo,团队!

我尝试将列表中的行复制到 XSSLSheet 为此,我尝试执行下一个代码:

HashMap<String, XSSFRow> listRows = new HashMap<String, XSSFRow>();
List<XSSFRow> rl = new ArrayList<XSSFRow>(listRows.values());
CellCopyPolicy ccp = new CellCopyPolicy();
ccp.setCopyCellValue(true);
ccp.setCopyCellStyle(false);
ccp.setCopyMergedRegions(false);

destSheet.copyRows(rl, 5, ccp)

但是系统会响应以下消息:

  

java.lang.IllegalArgumentException:外面的行号(-354)无效   允许范围(0..1048575)   org.apache.poi.xssf.usermodel.XSSFRow.setRowNum(XSSFRow.java:407)   org.apache.poi.xssf.usermodel.XSSFSheet.createRow(XSSFSheet.java:739)   org.apache.poi.xssf.usermodel.XSSFSheet.copyRows(XSSFSheet.java:2897)

在我的情况下解决这个问题 - 将参数添加到CellCopyPolicy:

ccp.setCondenseRows(true);

代码工作区:

HashMap<String, XSSFRow> listRows = new HashMap<String, XSSFRow>();
List<XSSFRow> rl = new ArrayList<XSSFRow>(listRows.values());
CellCopyPolicy ccp = new CellCopyPolicy();
ccp.setCopyCellValue(true);
ccp.setCopyCellStyle(false);
ccp.setCopyMergedRegions(false); 
ccp.setCondenseRows(true); //look here

destSheet.copyRows(rl, 5, ccp)

最好的问候&amp; 73)