easyExcel模板导出列表 行不包含在“表设计”

用的是easyExcel 填充模板 导出列表List,最终效果需所有行包含到“表设计”菜单中

img


以下为导出时问题截图:

img

如果您正在使用easyExcel进行导出,并希望将导出的Excel中的所有行都包含到“表设计”菜单中,您可以按照以下步骤进行操作:

在easyExcel中找到导出模板,并在其中添加“表设计”菜单。

在代码中使用easyExcel中的API来填充模板并导出数据到Excel文件中。例如:

// 加载导出模板
ExcelWriter writer = EasyExcel.write(filePath, templateClass).build();
WriteSheet sheet = writer.getSheet(sheetName);

// 填充数据到Excel模板中
List<List<Object>> dataList = new ArrayList<List<Object>>();
for (Object data : exportDataList) {
    List<Object> rowData = new ArrayList<Object>();
    // 将数据行添加到rowData中
    dataList.add(rowData);
}
writer.write(dataList, sheet);

// 修改“表设计”菜单的范围,使其包含所有行(假设有n行数据)
writer.setSheetName(sheetNo, sheetName, n, 0); // 将“表设计”菜单的结束行修改为n行

// 导出Excel文件
writer.finish();

在上面的代码中,filePath表示导出的Excel文件路径,templateClass表示导出模板的实际类,sheetName表示导出模板的工作表名称,exportDataList表示要导出的数据列表。在循环填充数据时,将每个数据行添加到rowData列表中,并将所有行的数据添加到dataList中。填充数据后,通过setSheetName()方法扩展“表设计”菜单的范围,以实现包含所有行的目的。最后,将数据写入Excel文件中并完成 Excel 导出。

请注意,上述代码只是一个示例,您可能需要根据实际情况进行适当修改。

我参考了一下GPT

// 创建ExcelWriter对象
ExcelWriter excelWriter = EasyExcel.write(fileName).build();

// 设置表头样式
WriteCellStyle headStyle = new WriteCellStyle();
headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
WriteFont headFont = new WriteFont();
headFont.setBold(true);
headStyle.setWriteFont(headFont);

// 设置内容样式
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
WriteFont contentFont = new WriteFont();
contentFont.setBold(false);
contentStyle.setWriteFont(contentFont);

// 设置Sheet样式
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName)
        .head(headList)
        .registerWriteHandler(new CustomCellWriteHandler())
        .registerWriteHandler(new CustomCellStatisticsWriteHandler())
        .build();

// 设置表格样式
TableStyle tableStyle = new TableStyle();
tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE);
tableStyle.setTableContentFont(contentFont);
tableStyle.setTableHeadBackGroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
tableStyle.setTableHeadFont(headFont);
tableStyle.setTableHeadBackGroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
writeSheet.setTableStyle(tableStyle);

// 导出数据到Excel
excelWriter.write(dataList, writeSheet);

// 关闭ExcelWriter对象
excelWriter.finish();


  • 这篇文章:EasyExcel:读取Excel数据到List集合中 也许有你想要的答案,你可以看看
  • 除此之外, 这篇博客: 【EasyExcel】十分钟入门 EasyExcel中的 使用 list 写 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •     /**
         * 使用list写
         * <p>1. 定义List<List<String>>结构的表头
         * <p>2. 定义List<List<Object>>结构的数据
         * <p>3. 写数据
         */
        @Test
        public void listWrite() {
            List<List<String>> head = new ArrayList<>();
            head.add(Arrays.asList("head1"));
            head.add(Arrays.asList("head2"));
            head.add(Arrays.asList("head3"));
            head.add(Arrays.asList("head4"));
    
            List<List<Object>> data = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                data.add(Arrays.asList("字符串" + i, new Date(), 0.56, (i % 2 == 0)));
            }
    
            EasyExcel.write("./test.xlsx")
                    .excelType(ExcelTypeEnum.XLSX)
                    .head(head)
                    .sheet("demoData")
                    .doWrite(data);
        }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    如果导出结果中的行没有包含在“表设计”菜单中,可以尝试在导出时为每一行设置行高,然后再设置整张表的行高。具体步骤如下:

    1. 导出时为每一行设置行高,使用EasyExcel的api即可,示例代码如下:
    ExcelWriter.write(list, sheet(), writeSheet(), simple(), new ColumnWidthStyle(), new RowHeightStyle()); // 定义一个RowHeightStyle类,在类中实现调用api设置每一行的行高即可
    
    1. 设置整张表的行高,也可以使用EasyExcel的api,示例代码如下:
    writeSheet().autoSizeColumn(0);//将第一列自适应列宽
    writeSheet().setColumnWidth(1,20);//将第二列的宽度设置为20
    sheet().setDefaultRowHeight((short) (16*30));//将行高设置为30
    

    这样设置完之后,就能够将所有行包含在“表设计”菜单中了。如果还存在问题,可以尝试查看easyExcel官方文档或者向官方提问。

使用的是EasyExcel库,要实现填充模板并将导出列表添加到"表设计"菜单中,
建议:
首先,创建一个Excel模板文件,包含所需的表头和格式。可以使用EasyExcel的API或模板引擎来创建模板。
在导出列表时,使用EasyExcel的API将数据写入模板文件中。可以按照以下方式编写代码,参考示例:

// 创建EasyExcel写入对象  
ExcelWriter excelWriter = EasyExcel.write("模板文件路径").build();  
  
// 定义写入的表格名称和表头  
List<String> headers = Arrays.asList("列1", "列2", "列3");  
String sheetName = "导出列表";  
  
// 写入表头  
excelWriter.write(null, headers, sheetName);  
  
// 写入数据列表  
List<List<Object>> dataList = new ArrayList<>();  
for (List<Object> rowList : data) {  
    dataList.add(rowList);  
}  
excelWriter.write(dataList, sheetName);  
  
// 关闭Excel写入对象  
excelWriter.finish();
#然后,在代码中添加以下语句,将导出的Excel文件添加到"表设计"菜单中:
// 创建EasyExcel读取对象  
ExcelReader excelReader = EasyExcel.read("模板文件路径").build();  
  
// 获取Excel文件中第一个工作表的数据  
List<List<Object>> data = excelReader.read(new Class[]{List.class}, "导出列表");  
  
// 将数据添加到"表设计"菜单中  
addTableDesignMenu(data);  
  
// 关闭Excel读取对象  
excelReader.finish();
#最后,实现addTableDesignMenu(List<List<Object>> data)方法,将导出的数据添加到"表设计"菜单中
private void addTableDesignMenu(List<List<Object>> data) {  
    // 创建菜单项数组  
    JTable table = new JTable(data.toArray(new List[0][]));  
    JScrollPane scrollPane = new JScrollPane(table);  
    JPopupMenu popupMenu = new JPopupMenu();  
    JMenuItem menuItem = new JMenuItem("表设计");  
    menuItem.addActionListener(e -> {  
        // 显示表设计对话框  
        JOptionPane.showMessageDialog(null, "请使用表设计工具对表格进行设计。");  
    });  
    popupMenu.add(menuItem);  
    table.setComponentPopupMenu(popupMenu);  
}
#如有帮助,恭请采纳

可以通过创建多个 Sheet,把同一批数据分别按顺序填充到不同的 Sheet 中,并在其中一个 Sheet 中创建“表设计”菜单所在行。以下是具体的实现步骤:

  1. 创建一个 ExcelExporter 对象,并使用 autoCloseStream() 方法自动关闭流。

    ExcelExporter exporter = EasyExcel.write(outputStream).autoCloseStream(true).build();
    
  2. 为同一批数据创建多个 Sheet,并填充数据。

    List<List<Map<String, Object>>> dataLists = splitDataList(dataList, sheetMaxRow);
    int sheetIndex = 1;
    for (List<Map<String, Object>> data : dataLists) {
        Sheet sheet = new Sheet(sheetIndex);
        sheetIndex++;
        sheet.setSheetName("Sheet" + sheetIndex);
        sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
        sheet.setColumnWidths(columnWidthMap);
        sheet.setClazz(TableData.class);
        // 在 "表设计" 菜单所在行添加一个空行
        int startRow = sheetIndex == 1 ? 0 : 1;
        writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(startRow, 0));
        // 填充表数据
        writer.write(data, sheet);
    }
    

    在以上代码中,我们把要导出的数据列表按照每个 Sheet 最大行数(sheetMaxRow)进行分组,然后依次填充到不同的 Sheet 中。同时,我们将每个 Sheet 的名称设为 "Sheet + sheetIndex",并设置了宽度和样式等信息。

  3. 在第一个 Sheet 中创建一个带有“表设计”菜单的空行。

    Sheet sheet = new Sheet(1);
    sheet.setSheetName("Sheet1");
    sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
    sheet.setColumnWidths(columnWidthMap);
    sheet.setClazz(TableData.class);
    // 添加一个空行,并设置行高和样式等信息
    writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(0, 0));
    sheet.getRow(0).setHeightInPoints(40);
    sheet.getRow(0).createCell(0);
    sheet.getRow(0).getCell(0).setCellValue("表设计");
    sheet.getRow(0).getCell(0).setCellStyle(CellStyleUtil.buildCellStyle(workbook, true, true, false, false));
    sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, header.length - 1));
    

    在以上代码中,我们创建了一个名称为 "Sheet1" 的 Sheet,添加了第一行并设置行高和样式等信息。然后,在第一行第一个单元格中填写 "表设计" 菜单,通过 addMergedRegion() 方法将第一行和第二行单元格合并,使其仅占据第一行。

  4. 导出 Excel。

    writer.finish();
    

    在最后,记得调用 finish() 方法,关闭 ExcelWriter 对象并保存导出的 Excel。

完整代码如下:

public static void exportExcel(List<Map<String, Object>> dataList, String[] header, Map<Integer, Integer> columnWidthMap, int sheetMaxRow, OutputStream outputStream) throws IOException {
    ExcelWriter writer = EasyExcel.write(outputStream).build();
    // 在第一个 sheet 中创建带有 "表设计" 菜单的空行
    Sheet sheet = new Sheet(1);
    sheet.setSheetName("Sheet1");
    sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
    sheet.setColumnWidths(columnWidthMap);
    sheet.setClazz(TableData.class);
    // 添加一个空行,并设置行高和样式等信息
    writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(0, 0));
    sheet.getRow(0).setHeightInPoints(40);
    sheet.getRow(0).createCell(0);
    sheet.getRow(0).getCell(0).setCellValue("表设计");
    sheet.getRow(0).getCell(0).setCellStyle(CellStyleUtil.buildCellStyle(workbook, true, true, false, false));
    sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, header.length - 1));

可以通过创建多个 Sheet,把同一批数据分别按顺序填充到不同的 Sheet 中,并在其中一个 Sheet 中创建“表设计”菜单所在行。以下是具体的实现步骤:

1. 创建一个 ExcelExporter 对象,并使用 autoCloseStream() 方法自动关闭流。

   ```java
   ExcelExporter exporter = EasyExcel.write(outputStream).autoCloseStream(true).build();
  1. 为同一批数据创建多个 Sheet,并填充数据。

    List<List<Map<String, Object>>> dataLists = splitDataList(dataList, sheetMaxRow);
    int sheetIndex = 1;
    for (List<Map<String, Object>> data : dataLists) {
        Sheet sheet = new Sheet(sheetIndex);
        sheetIndex++;
        sheet.setSheetName("Sheet" + sheetIndex);
        sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
        sheet.setColumnWidths(columnWidthMap);
        sheet.setClazz(TableData.class);
        // 在 "表设计" 菜单所在行添加一个空行
        int startRow = sheetIndex == 1 ? 0 : 1;
        writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(startRow, 0));
        // 填充表数据
        writer.write(data, sheet);
    }
    

    在以上代码中,我们把要导出的数据列表按照每个 Sheet 最大行数(sheetMaxRow)进行分组,然后依次填充到不同的 Sheet 中。同时,我们将每个 Sheet 的名称设为 "Sheet + sheetIndex",并设置了宽度和样式等信息。

  2. 在第一个 Sheet 中创建一个带有“表设计”菜单的空行。

    Sheet sheet = new Sheet(1);
    sheet.setSheetName("Sheet1");
    sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
    sheet.setColumnWidths(columnWidthMap);
    sheet.setClazz(TableData.class);
    // 添加一个空行,并设置行高和样式等信息
    writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(0, 0));
    sheet.getRow(0).setHeightInPoints(40);
    sheet.getRow(0).createCell(0);
    sheet.getRow(0).getCell(0).setCellValue("表设计");
    sheet.getRow(0).getCell(0).setCellStyle(CellStyleUtil.buildCellStyle(workbook, true, true, false, false));
    sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, header.length - 1));
    

    在以上代码中,我们创建了一个名称为 "Sheet1" 的 Sheet,添加了第一行并设置行高和样式等信息。然后,在第一行第一个单元格中填写 "表设计" 菜单,通过 addMergedRegion() 方法将第一行和第二行单元格合并,使其仅占据第一行。

  3. 导出 Excel。

    writer.finish();
    

    在最后,记得调用 finish() 方法,关闭 ExcelWriter 对象并保存导出的 Excel。

完整代码如下:

public static void exportExcel(List<Map<String, Object>> dataList, String[] header, Map<Integer, Integer> columnWidthMap, int sheetMaxRow, OutputStream outputStream) throws IOException {
    ExcelWriter writer = EasyExcel.write(outputStream).build();
    // 在第一个 sheet 中创建带有 "表设计" 菜单的空行
    Sheet sheet = new Sheet(1);
    sheet.setSheetName("Sheet1");
    sheet.setAutoFilter(new CellRangeAddress(0, 1, 0, header.length - 1));
    sheet.setColumnWidths(columnWidthMap);
    sheet.setClazz(TableData.class);
    // 添加一个空行,并设置行高和样式等信息
    writer.write(NamedRowData.builder().build(), sheet, new SheetWriteTableWriterParameter(0, 0));
    sheet.getRow(0).setHeightInPoints(40);
    sheet.getRow(0).createCell(0);
    sheet.getRow(0).getCell(0).setCellValue("表设计");
    sheet.getRow(0).getCell(0).setCellStyle(CellStyleUtil.buildCellStyle(workbook, true, true, false, false));
    sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, header.length - 1));

2020最简单的java导出excel,使用easyexcel和准备好的excel模板进行数据填充导出
可以试试

WriteSheet.setRelativeHeadRowIndex(3);
设置表头行下标


// 创建一个List对象,其中包含所有要导出的行数据
List<MyData> dataList = new ArrayList<>();
dataList.add(new MyData("A1", "B1"));
dataList.add(new MyData("A2", "B2"));
dataList.add(new MyData("A3", "B3"));
// ...

// 将数据写入Excel文件中
String fileName = "my_excel_file.xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
excelWriter.write(dataList, writeSheet);
excelWriter.finish();

// 设置列宽自适应、起始行数为0、结束行数为List对象的大小、设置列宽
Sheet sheet = excelWriter.getSheet();
sheet.setAutoWidth(true);
sheet.setStartRow(0);
sheet.setEndRow(dataList.size());
for (int i = 0; i < dataList.size(); i++) {
    for (int j = 0; j < dataList.get(i).getFields().length; j++) {
        sheet.setColumnWidth(j, sheet.getColumnWidth(j) * 2); // 将列宽扩大两倍以适应更多数据
    }
}

// 关闭ExcelWriter对象
excelWriter.close();

这很可能是你的导出时使用到的模板的问题,表设计这个菜单选项只有当当前是Excel表格的时候才会出现。因此,如果你现在不显示表设计这个选项,说明你的模板样式可能存在问题,或者由于你的程序的问题导致数据写入之后样式出现了问题。你看你的Excel左边显示有一段空白的。建议你检查下的代码和模板的样式问题。

可能模板文件的设置不正确,检查一下