当前位置: 首页 > 知识库问答 >
问题:

Apache POI XSSFWorkbook setSheetOrder未排序

唐晗昱
2023-03-14
        // 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);

共有1个答案

袁和通
2023-03-14

无法再现该行为。请给出一个最小的、可复制的例子来说明这种行为。

我将提供一个这样的证明它正常工作:

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;
  }
 }
}

在控制台上打印以下内容:

axel@arichter:~/Dokumente/JAVA/poi/poi-4.1.1$ javac -Xlint:deprecation -Xlint:unchecked -cp .:./*:./lib/*:./ooxml-lib/* ExcelSetSheetOrder.java 
axel@arichter:~/Dokumente/JAVA/poi/poi-4.1.1$ java -cp .:./*:./lib/*:./ooxml-lib/* ExcelSetSheetOrder 
3 -> 1
4 -> 2
5 -> 3
6 -> 4
7 -> 5
8 -> 6

并导致以下结果excelnew.xlsx:

 类似资料:
  • 我遇到了Java内置的collections.sort()方法的问题。我试图对一个名为TreeNode的自定义对象类型的ArrayList进行排序。我在过去成功地使用了这种方法,并希望外界看看我是否遗漏了任何明显的东西。 我希望通过一个整数字段对这些TreeNode对象进行排序,该字段都被称为myWeight。myWeight是特定字符在文本文件中出现的次数的整数表示。在我的项目中,我使用了一个名

  • 我正在尝试自己编程气泡排序、选择排序和插入排序。但是,我在插入排序方面遇到了麻烦。我会提供我的代码以及每行在做什么 好的,所以int count是找出排序数组的起始位置。然后我声明了index以查找将元素放在排序数组之后的位置,并为未排序数组的第一个元素声明了一个临时int,如果它小于排序数组的最后一个元素。然后它反转数组直到第一个元素,如果它大于我要添加的元素,则为其索引分配索引。本质上是为了让

  • 问题内容: 希望有人知道此Java认证问题的答案: 哪两个结果可能?(选择两个。) A)7 0 B)7 1 C)7 3 D)-1 0 E)-1 1 F)-1 3 唯一的正确答案是E)-1 1,因为如果您执行二进制搜索算法,这是唯一可能的输出。但是他们要我选择两个…所以第二个必须是B)7 1然后,因为排序数组中的第二个binarySearch总是会返回。 所以我的问题是,为什么B)7 1是可能的结果

  • 问题内容: 该中应该是未排序,但被相对于分类。 我遇到了这个问题,因为我需要插入顺序数据。因此,我改用了。但是我还是很困惑为什么要对它进行排序。 有人可以解释吗? 我做了一个简单的例子来查看排序。 结果: 编辑: 我试图插入使用50支随机数的,我发现了一些数据未排序。但是,它仍然设法对大多数整数进行排序。 随机结果: 问题答案: 这是一个巧合(不是真的,而是与哈希算法有关)。 尝试添加 最后。 输

  • 我有一个复杂的拖放场景,我只是不明白。我想出来的是:jsfiddle.net/aTjMG/2/ 在左边,我有一个名单。在右边,我有一组团队。左边的列表应该按字母顺序排列,不可排序。用户应该能够通过从左侧的列表中拖动到一个团队来将一个人分配到一个团队。被分配到团队的人应该能够被排序或移动到另一个团队,或者移动回未分配的池。 我可以从左边的未分配池移动到任何团队。我可以对团队中的人进行分类。从这里我不

  • 问题内容: 我想通过linux对文本文件进行排序,如下所示 我期望这样的结果: 但是,即使使用各种选项,也使用,该行仍在中间。为什么?我会理解位于底部还是顶部(取决于空格字符是小于还是大于),但是出于什么原因却将其保留在中间呢? 问题答案: 它使用系统区域设置来确定字母的排序顺序。我的猜测是,根据您的语言环境,它会忽略空格。