Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache POI XSSF工作簿设置表未排序_Java_Excel_Apache Poi - Fatal编程技术网

Java Apache POI XSSF工作簿设置表未排序

Java Apache POI XSSF工作簿设置表未排序,java,excel,apache-poi,Java,Excel,Apache Poi,我正在使用ApachePOI(4.1.1)修改现有工作簿。工作簿包含四页。我使用第二张图纸作为模板,将其克隆,然后将数据写入新克隆的图纸。它被克隆了六次左右。在这个过程结束时,我删除了模板工作表,然后尝试为所有工作表设置工作表顺序:现有工作表(减去模板),然后是我克隆的工作表。我正在使用XSSFWorkbook::setSheetOrder来执行此操作,我看到它在调试中更改了索引,但当我的Excel文件实际写入时,工作表不符合顺序 以下是相关代码: // wb is an XSS

我正在使用ApachePOI(4.1.1)修改现有工作簿。工作簿包含四页。我使用第二张图纸作为模板,将其克隆,然后将数据写入新克隆的图纸。它被克隆了六次左右。在这个过程结束时,我删除了模板工作表,然后尝试为所有工作表设置工作表顺序:现有工作表(减去模板),然后是我克隆的工作表。我正在使用XSSFWorkbook::setSheetOrder来执行此操作,我看到它在调试中更改了索引,但当我的Excel文件实际写入时,工作表不符合顺序

以下是相关代码:

        // wb is an XSSFWorkbook
        wb.removeSheetAt(wb.getSheetIndex("Original Sheet 2")); // Remove the template sheet
        wb.setSheetOrder("Original Sheet 1", 0);
        for (ReportPresenter presenter : dataMap.values()) {
            String sheetTitle = makeSheetTitleFromPresenter(presenter);
            int oldIndex = wb.getSheetIndex(wb.getSheet(sheetTitle));
            wb.setSheetOrder(sheetTitle, presenter.getAnalysisNumber());
            int newIndex = wb.getSheetIndex(wb.getSheet(sheetTitle));
            System.out.println(oldIndex + " -> " + newIndex);
        }
        wb.setSheetOrder("Original Sheet 3", dataMap.size() + 1);
        wb.setSheetOrder("Original Sheet 4", dataMap.size() + 2);

我在上面包含了debug println,以便在这里显示我如何知道索引实际上正在使用setSheetOrder方法更改为我想要的顺序。但是,当我打开由该代码生成的Excel文件时,我的工作表都存在,但它们不是我指定的顺序


我真的很想有一些想法!谢谢。

无法复制这种行为。请出示一张显示该行为的照片

我将提供一份证明其正常工作的报告:

从下面的
Execl.xlsx
开始:

然后是以下代码:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.xssf.usermodel.*;

public class ExcelSetSheetOrder {

 public static void main(String[] args) throws Exception {

  java.util.Map<Integer, ReportPresenter> dataMap = new java.util.HashMap<Integer, ReportPresenter>();
  dataMap.put(1, new ReportPresenter("New Sheet 1", 1));
  dataMap.put(2, new ReportPresenter("New Sheet 2", 2));
  dataMap.put(3, new ReportPresenter("New Sheet 3", 3));
  dataMap.put(4, new ReportPresenter("New Sheet 4", 4));
  dataMap.put(5, new ReportPresenter("New Sheet 5", 5));
  dataMap.put(6, new ReportPresenter("New Sheet 6", 6));

  try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("./Excel.xlsx"))) {

   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(1).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(2).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(3).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(4).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(5).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(6).getSheetTitle());

   workbook.removeSheetAt(workbook.getSheetIndex("Original Sheet 2")); // Remove the template sheet
   workbook.setSheetOrder("Original Sheet 1", 0);
   for (ReportPresenter presenter : dataMap.values()) {
    String sheetTitle = presenter.getSheetTitle();
    int oldIndex = workbook.getSheetIndex(workbook.getSheet(sheetTitle));
    workbook.setSheetOrder(sheetTitle, presenter.getAnalysisNumber());
    int newIndex = workbook.getSheetIndex(workbook.getSheet(sheetTitle));
    System.out.println(oldIndex + " -> " + newIndex);
   }
   workbook.setSheetOrder("Original Sheet 3", dataMap.size() + 1);
   workbook.setSheetOrder("Original Sheet 4", dataMap.size() + 2);

   String filePath = "./ExcelNew.xlsx";
   try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
    workbook.write(fileOut);
   }
  }
 }

 static class ReportPresenter {
  String sheetTitle = "";
  int analysisNumber = -1;

  public ReportPresenter(String sheetTitle, int analysisNumber) {
   this.sheetTitle = sheetTitle;
   this.analysisNumber = analysisNumber;
  }

  public int getAnalysisNumber() {
   return this.analysisNumber;
  }
  public String getSheetTitle() {
   return this.sheetTitle;
  }
 }
}
并导致此结果
ExcelNew.xlsx


无法复制该行为。请出示一张显示该行为的照片

我将提供一份证明其正常工作的报告:

从下面的
Execl.xlsx
开始:

然后是以下代码:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.xssf.usermodel.*;

public class ExcelSetSheetOrder {

 public static void main(String[] args) throws Exception {

  java.util.Map<Integer, ReportPresenter> dataMap = new java.util.HashMap<Integer, ReportPresenter>();
  dataMap.put(1, new ReportPresenter("New Sheet 1", 1));
  dataMap.put(2, new ReportPresenter("New Sheet 2", 2));
  dataMap.put(3, new ReportPresenter("New Sheet 3", 3));
  dataMap.put(4, new ReportPresenter("New Sheet 4", 4));
  dataMap.put(5, new ReportPresenter("New Sheet 5", 5));
  dataMap.put(6, new ReportPresenter("New Sheet 6", 6));

  try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("./Excel.xlsx"))) {

   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(1).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(2).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(3).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(4).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(5).getSheetTitle());
   workbook.cloneSheet(workbook.getSheetIndex("Original Sheet 2"), dataMap.get(6).getSheetTitle());

   workbook.removeSheetAt(workbook.getSheetIndex("Original Sheet 2")); // Remove the template sheet
   workbook.setSheetOrder("Original Sheet 1", 0);
   for (ReportPresenter presenter : dataMap.values()) {
    String sheetTitle = presenter.getSheetTitle();
    int oldIndex = workbook.getSheetIndex(workbook.getSheet(sheetTitle));
    workbook.setSheetOrder(sheetTitle, presenter.getAnalysisNumber());
    int newIndex = workbook.getSheetIndex(workbook.getSheet(sheetTitle));
    System.out.println(oldIndex + " -> " + newIndex);
   }
   workbook.setSheetOrder("Original Sheet 3", dataMap.size() + 1);
   workbook.setSheetOrder("Original Sheet 4", dataMap.size() + 2);

   String filePath = "./ExcelNew.xlsx";
   try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
    workbook.write(fileOut);
   }
  }
 }

 static class ReportPresenter {
  String sheetTitle = "";
  int analysisNumber = -1;

  public ReportPresenter(String sheetTitle, int analysisNumber) {
   this.sheetTitle = sheetTitle;
   this.analysisNumber = analysisNumber;
  }

  public int getAnalysisNumber() {
   return this.analysisNumber;
  }
  public String getSheetTitle() {
   return this.sheetTitle;
  }
 }
}
并导致此结果
ExcelNew.xlsx


事实证明,我对XSSFWorkbook::setSheetOrder的工作原理存在误解

我(错误地)假设设置工作表的顺序会使工作表保持在该位置,有点像将工作表开槽到索引中形成一个数组。但是,如果最近一次调用隐式修改了上次调用中使用的图纸前面的顺序,则对setSheetOrder的后续调用将修改其他图纸的图纸顺序

例如,如果按如下方式订购图纸:

[StaticX,StaticY,Cloned3,Cloned4,Cloned1,Cloned2],您称之为setSheetOrder(“Cloned3”,3)

命令变为

[StaticX,StaticY,Cloned4,Cloned3,Cloned1,Cloned2]这是需要的

但是,随后调用setSheetOrder(“Cloned1”,1)现在就可以下订单了

[StaticX,Cloned1,StaticY,Cloned4,Cloned3,Cloned2]已将Cloned3移出位置3

在我的调试打印中,我认为这是可行的,因为我只是检查上次调用设置的顺序,当然每次都是正确的,但是当我在每次设置图纸顺序之后开始打印所有图纸的顺序时,问题变得很明显

为了解决这个问题,我只需按照我想要的顺序将我所有的SheetName放入一个数组中,然后按顺序从第一个到最后一个设置工作表顺序,这非常有效


非常感谢Axel提供了这个最小的示例。

事实证明,我对XSSFWorkbook::setSheetOrder的工作原理有一个误解

我(错误地)假设设置工作表的顺序会使工作表保持在该位置,有点像将工作表开槽到索引中形成一个数组。但是,如果最近一次调用隐式修改了上次调用中使用的图纸前面的顺序,则对setSheetOrder的后续调用将修改其他图纸的图纸顺序

例如,如果按如下方式订购图纸:

[StaticX,StaticY,Cloned3,Cloned4,Cloned1,Cloned2],您称之为setSheetOrder(“Cloned3”,3)

命令变为

[StaticX,StaticY,Cloned4,Cloned3,Cloned1,Cloned2]这是需要的

但是,随后调用setSheetOrder(“Cloned1”,1)现在就可以下订单了

[StaticX,Cloned1,StaticY,Cloned4,Cloned3,Cloned2]已将Cloned3移出位置3

在我的调试打印中,我认为这是可行的,因为我只是检查上次调用设置的顺序,当然每次都是正确的,但是当我在每次设置图纸顺序之后开始打印所有图纸的顺序时,问题变得很明显

为了解决这个问题,我只需按照我想要的顺序将我所有的SheetName放入一个数组中,然后按顺序从第一个到最后一个设置工作表顺序,这非常有效

非常感谢Axel提供了这个最小的示例