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