繁体   English   中英

使用Apache poi和servlet创建多个工作表

[英]Creating multiple sheets using Apache poi and servlets

当我使用Apache poi和servlet创建多个工作表时。 它正在创建工作表但不将数据写入文件。 我试图通过下面的代码将前1000条记录写入sheet1,将下一条1000写入sheet2,但不能正常工作

private void writeDataToExcelFile(String string,
        ArrayList<ArrayList<String>> excelData, OutputStream outputStream) {
    HSSFWorkbook myWorkBook = new HSSFWorkbook();
    String sheetName = "";
    sheetName = "Document-" + 0;
    HSSFSheet mySheet = myWorkBook.createSheet();
    HSSFRow myRow = null;
    HSSFCell myCell = null;
    for (int rowNum = 0; rowNum < excelData.size(); rowNum++) {
        ArrayList<String> rowData = excelData.get(rowNum);
        if(rowNum>0 && rowNum%1000 == 0)
        {
            sheetName = "Document-" + (rowNum/1000);
            mySheet = myWorkBook.createSheet();
        }
        myRow = mySheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < rowData.size(); cellNum++) {
            myCell = myRow.createCell(cellNum);
            myCell.setCellValue(rowData.get(cellNum));
        }
    }
    System.out.println("Last row:" + mySheet.getLastRowNum());
    System.out.println("Row number:" + mySheet.rowIterator().next().getRowNum());
    try {
        myWorkBook.write(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我的逻辑有什么问题。请做必要的帮助。 谢谢

循环遍历数据集时,您希望在第1000行拆分以启动新工作表,这很好,但是当您启动新工作表时,您创建的下一行是行1001(外部循环索引变量)

myRow = mySheet.createRow(rowNum);

要获得您想要的效果,请将循环更改为如下所示:

int currentRow = 0;
for (int rowNum = 0; rowNum < excelData.size(); rowNum++) 
{
  ArrayList<String> rowData = excelData.get(rowNum);

  if(currentRow == 1000)
  {
    sheetName = "Document-" + (rowNum/1000);
    mySheet = myWorkBook.createSheet();
    currentRow = 0;
  }
  myRow = mySheet.createRow(currentRow);
  for (int cellNum = 0; cellNum < rowData.size(); cellNum++) 
  {
    myCell = myRow.createCell(cellNum);
    myCell.setCellValue(rowData.get(cellNum));
  }

  currentRow++;
}

我没有编译这个,所以我不知道它是否会立即起作用,但它应该指向正确的方向。

HTH

编辑
进一步考虑这个问题,你可以从1行更改到原始应用程序获得相同的效果(尽管有点清晰):

myRow = mySheet.createRow(rowNum%1000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM