EasyExcel行转列,二次填充(问题处理)

使用行转列的填充的处理实例,请参考EasyExcel行转列,不定长换行导出__easyexcel换行导出

在使用EasyExcel填充过程中,会遇到有部分列数据,看似丢失,但是填充的标记还存在,如{data.name},其实是EasyExcel内部机制导出这一列的部分数据没有被填。

经过反复的测试,向右填充时候,必须要有列头,是内部几部机制造成!

解决方案:

方案一、修改EasyExcel的Api重新打包,这种方式费时费力就不考虑.

方案二、使用POI,原生Excel工具写Excel。

生成代码如下:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet1 = workbook.createSheet("1");
XSSFSheet sheet = workbook.createSheet("2");

XSSFRow row0 = sheet1.createRow(0);
row0.createCell(0).setCellValue("aa单");
CellRangeAddress ca = new CellRangeAddress(0, 0, 0, 3 + skuList.size());
sheet1.addMergedRegion(ca);
CellStyle cs = workbook.createCellStyle();
cs.setAlignment(HorizontalAlignment.CENTER);
cs.setVerticalAlignment(VerticalAlignment.CENTER);
XSSFFont font = workbook.createFont();
font.setFontHeight(14);
font.setBold(true);
cs.setFont(font);
row0.getCell(0).setCellStyle(cs);
XSSFRow row1 = sheet1.createRow(1);
String[] headers = {"序号", "商品编码", "商品编码",
        "商品名称", "商品单位",
        "商品规格", "ab",
        "订购总数量", "{data2.deliveryName}"};
CellStyle cs1 = workbook.createCellStyle();
cs1.setAlignment(HorizontalAlignment.CENTER);
cs1.setVerticalAlignment(VerticalAlignment.CENTER);
XSSFFont font1 = workbook.createFont();
font1.setFontHeight(10);
font1.setBold(true);

cs1.setFont(font1);
for (int i = 0; i < 9; i++) {
    sheet1.setColumnWidth(i,  13 * 256);
    XSSFCell cell = row1.createCell(i);
    cell.setCellValue(headers[i]);
    cell.setCellStyle(cs1);
}

AtomicInteger integer = new AtomicInteger(2);
for (ExportSkuAndDeliveryInfo i : skuList) {
    XSSFRow row2 = sheet1.createRow(integer.get());
    //4.创建一个单元格
    row2.createCell(0).setCellValue(i.getSkuId());
    row2.createCell(1).setCellValue(i.getSkuName());
    row2.createCell(2).setCellValue(i.getTotalQuantity().toString());
    row2.createCell(3).setCellValue(i.getRemark());
    integer.addAndGet(1);
}
FileOutputStream fos = new FileOutputStream(templateFileName);
workbook.write(fos);
workbook.close();
fos.close();

首次写入如下:

第二次填充的代码和效果如下:

 

final ExcelWriter writer = EasyExcel.write("d://2.xlsx").withTemplate(templateFileName).build();
FillConfig config = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
WriteSheet ws = EasyExcel.writerSheet().build();
writer.fill(new FillWrapper("data2", deliveryList), config, ws);
tempMap.forEach((k, v) -> {
    writer.fill(new FillWrapper(k, v), config, ws);
});
writer.finish();

 

你可以使用 EasyExcel 库来实现列转行的操作。下面是一个示例代码,可以将 Excel 中的数据从列转换为行: ```java import com.alibaba.excel.EasyExcel; public class ColumnToRowExample { public static void main(String[] args) { // 读取 Excel 文件 String filename = "path/to/your/excel/file.xlsx"; List<List<String>> columnData = EasyExcel.read(filename).sheet().doReadSync(); // 转换数据 List<List<String>> rowData = new ArrayList<>(); int rows = columnData.get(0).size(); int columns = columnData.size(); for (int i = 0; i < rows; i++) { List<String> row = new ArrayList<>(); for (int j = 0; j < columns; j++) { row.add(columnData.get(j).get(i)); } rowData.add(row); } // 写入新的 Excel 文件 String newFilename = "path/to/your/new/excel/file.xlsx"; EasyExcel.write(newFilename).sheet().doWrite(rowData); System.out.println("列转行完成!"); } } ``` 你需要将 `path/to/your/excel/file.xlsx` 替换为你的实际 Excel 文件路径,将 `path/to/your/new/excel/file.xlsx` 替换为输出的新 Excel 文件路径。这段代码会将原始 Excel 文件中的数据从列转换为行,并将结果写入到新的 Excel 文件中。 请确保你已经将 EasyExcel 添加到你的项目依赖中。你可以在 Maven 的 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.0</version> </dependency> ``` 希望这可以帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值