Apache POI Excel-如何配置要扩展的列?


98

Apache POI API用来生成excel spreadsheet输出一些数据。

我面临的问题是在创建和打开电子表格时,列不会展开,因此乍一看,某些长文本(如日期格式的文本)不会显示出来。

我可以双击excel中的列边框以扩大或拖动边框以调整列宽,但是可能会有20多个列,而且每次打开电子表格时,我都不想手动进行此操作:(

我发现了(虽然可能是错误的方法)groupRow()setColumnGroupCollapsed()也许可以做到这一点,但没有运气。也许我以错误的方式使用它。

示例代码段

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

创建此电子表格后,“ Looooooong文本不首先显示”字符串位于单元格中,但是由于未展开该列,因此仅显示“ Loooooooo”。

如何配置它,以便在打开电子表格时该列已被扩展?



您似乎正在寻找一种使用POI来完成此操作的方法。但是只需在Excel中选择整个工作表,然后双击AB列标题边界即可。如果您需要将此操作分成几页,则编码解决方案可能会为您提供更好的服务。
2014年

Answers:


172

之后添加完所有数据的表,你可以叫autoSizeColumn(int column)上你的表的列自动调整到合适的大小

这是指向API的链接。

请参阅此帖子以获取更多参考 信息使用apache poi时,如何使excel单元格大小适合内容的大小


7
只是想指出的是,autoSizeColumn不能很好地扩展,将是超级慢,如果你有大量的行。我不得不变得有些骇人听闻,并且做了与这个问题所建议的类似的事情。
lbstr 2014年

8
关于 autoSizeColumn的警告,这需要Java Font可用。这不是服务器上使用的无头java jre的一部分,并且将引发NullPointerException。
斯蒂芬·狄龙

@StephenDillon任何想法如何解决字体配置的空指针?
Veeshal

我们发现的最佳方法是遍历col中的每一行,找到最长的char长度,然后乘以x +添加一个缓冲区。X使用试错法来确定合适的值,但是它应该是char的平均宽度。没有字体,我不相信您可以正确地实现它,但是我们已经接近了。否则,您可以在用户第一次打开宏时向Excel添加一个宏来修复它,这是最好的方法,但需要启用宏
Stephen Dillon

45

提示:要使“自动调整大小”有效,sheet.autoSizeColumn(columnNumber)将数据填充到excel中调用。

在填充数据之前调用该方法无效。



此处提供的答案与Java有关,而注释中提供的链接与Android有关。答案仍然适用于所有Java情况(无头Java JRE(没有Java字体可用)除外)。
Unni Kris,

谢谢,我计算了func,并以以下方式使用setColumnWidth: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586您可以为我详细介绍一下此方法

39

如果要自动调整工作簿中所有列的大小,请使用以下方法:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}

NullPointerException到了row.cellIterator()。是因为我在其中一个单元中没有价值吗?
rakeeee

10

您可以尝试如下操作:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

这里的参数是:图纸中的列号及其宽度但是宽度的单位很小,例如,您可以尝试4000。


很高兴知道谢谢!我认为出于我的目的,列字符串可能会动态生成,因此自动调整大小的方法适合这种情况。


5

下面的示例代码

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

//这很关键

sheet.autoSizeColumn(0);

//参数必须是单元格编号

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

检查输出并拧紧:)


2
sheet.setColumnWidth(columnIndex,width)也是您要查看的方法
2014年

3

如果您知道列数(等于集合列表)。您可以简单地使用此衬纸来调整一张纸的所有列(如果您至少使用Java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

我使用下面的简单解决方案:

这是您的工作簿和工作表:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

然后将数据添加到具有列和行的工作表中。将数据添加到工作表后,将以下代码写入autoSizeColumn宽度。

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

在这里,而不是15,您在工作表中添加了列数。

希望有人能帮上忙。



0

您也可以包装文字。PFB示例代码:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.