Java_复杂Excel导入导出和转换

基于EasyExcel实现百万级数据导入导出_easyexcel导出百万级数据-CSDN博客

百万数据导入导出:
想要解决问题我们首先要明白自己遇到的问题是什么?

1、 我遇到的数据量超级大,使用传统的POI方式来完成导入导出很明显会内存溢出,并且效率会非常低;

2、 数据量大直接使用select * from tableName肯定不行,一下子查出来300w条数据肯定会很慢;

3、 300w 数据导出到Excel时肯定不能都写在一个Sheet中,这样效率会非常低;估计打开都得几分钟;

4、 300w数据导出到Excel中肯定不能一行一行的导出到Excel中。频繁IO操作绝对不行;

5、 导入时300万数据存储到DB如果循环一条条插入也肯定不行;

6、导入时300w数据如果使用Mybatis的批量插入肯定不行,因为Mybatis的批量插入其实就是SQL的循环;一样很慢。

解决思路:

针对1 :
其实问题所在就是内存溢出,我们只要使用对上面介绍的POI方式即可,主要问题就是原生的POI解决起来相当麻烦。

经过查阅资料翻看到阿里的一款POI封装工具EasyExcel,上面问题等到解决;

针对2:
不能一次性查询出全部数据,我们可以分批进行查询,只不过时多查询几次的问题,况且市面上分页插件很多。此问题好解决。

针对3:
可以将300w条数据写到不同的Sheet中,每一个Sheet写一百万即可。

针对4:
不能一行一行的写入到Excel上,我们可以将分批查询的数据分批写入到Excel中。(官方文档:注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入)写Excel | Easy Excel

针对5:
导入到DB时我们可以将Excel中读取的数据存储到集合中,到了一定数量,直接批量插入到DB中。

针对6:
不能使用Mybatis的批量插入,我们可以使用JDBC的批量插入,配合事务来完成批量插入到DB。即 Excel读取分批+JDBC分批插入+事务。
————————————————
版权声明:本文为CSDN博主「llp1110」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44981526/article/details/128738042

Excel常用的几种方法:POI,jxls,easypoi,easyexcel

史上最全的excel读写技术分享_烟花散尽13141的博客-CSDN博客_aftercelldispose

1:Easypoi实现导入导出excel:

EasyPoi实现excel文件导入导出_crysw的博客-CSDN博客_easypoi excel导入

public class OfficialExcelUtil {
    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
        ExportParams exportParams = new ExportParams();
        exportParams.setCreateHeadRows(isCreateHeader);
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        if (workbook != null) ;
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            try {
                throw new Exception(e.getMessage());
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

}

Easypoi支持二进制导出图片

//实体字段
private byte[] oilCostRecord;

//下载后下来后转成字节
Result result = systemMinioProvider.downloadBase64(record.getRecord());
String split = result.getData().toString().split("base64,")[1];
byte[] decode = Base64.getDecoder().decode(split);
ExcelVo.setRecord(decode);

//调用导出
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);

2:Easyexcel实现导入导出excel:

EasyExcel官方文档

通过实现CellWriteHandler接口,处理WPS打开Excel之后,不识别对应的类型:

EasyExcel 导出 excel 后无法实现日期筛选与数值类型合计问题与解决_easyexcel 数值型-CSDN博客

Easyexcel导出导入字段展示类型转换问题解决:(拦截器实现:注解或者注册拦截器)

EasyExcel报错 ExcelDataConvertException: Can not find ‘Converter‘ support class List_com.alibaba.excel.exception.exceldataconvertexcept-CSDN博客

合并单元格问题处理:

​​​​​​EasyExcel导入存在合并单元格的Excel_easyexcel导入合并单元格_我可能在扯淡的博客-CSDN博客

EasyExcel模板导出(行和列自动合并)_easyexcel 模板导出_Lzfnemo2009的博客-CSDN博客(牛逼)

EasyExcel导出合并单元格_easyexcel合并单元格_是一个菜鸟程序员啊的博客-CSDN博客

https://www.jb51.net/article/258822.htm EasyExcel工具读取Excel空数据行问题的解决办法

EasyExcel实现Excel文件导入导出_crysw的博客-CSDN博客_easyexcel

3:Java导出复杂数据到Excel(apache poi)(使用反射获取bean的get方法获取值)

https://blog.csdn.net/hjf_1291030386/article/details/75288220

4:HuTool工具包导入导出excel

Hutool参考文档

@Slf4j
@Component
public class ExcelExportHandler {
    /**
     * 下载Excel格式的数据
     *
     * @param response response
     * @param fileName 文件名(支持中文)
     * @param data     待下载的数据
     * @param map    key 为对象中的字段名  value 为表头展示的文字
     * @param <T>      数据泛型
     */
    public static  <T> void export(HttpServletResponse response, String fileName,
                                   List<T> data, LinkedHashMap<String,String> map) throws IOException {
        ExcelWriter writer = ExcelUtil.getWriter();
        // 数据为空,打印表头
        if (CollectionUtil.isEmpty(data)){
            writer.writeHeadRow(map.values());
        }        
        for(String str : map.keySet()){
            writer.addHeaderAlias(str,map.get(str));
        }
        writer.setColumnWidth(-1, 30);
        writer.setRowHeight(-1, 20);
        writer.write(data,true);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        fileName= URLEncoder.encode(fileName,"UTF-8");
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
        ServletOutputStream outputStream= response.getOutputStream();
        writer.flush(outputStream,true);
        outputStream.close();
        writer.close();
    }

}

5:若依导出使用Field.get(object)获取bean字段的值(apache poi)(Field.get(obj)取得对象obj的Field属性值)

(8条消息) Springboot导出EXCEl方法(若依实例)_星光榴莲鸡的博客-CSDN博客_springboot导出excel表格

6:Java根据模板导出excel(jxls.poi) easyexcel easypoi jxls都支持模板导出

问题1:

使用fileName = URLEncoder.encode(fileName, "UTF-8");偶尔不生效时,使用下面方法解决中文乱码问题。

JAVA输出EXCEL文件名中文乱码解决
response.setCharacterEncoding(“UTF-8”);
String filename = new String( “明细记录”.getBytes(“utf-8” ), “ISO8859-1” );
response.setHeader(“Content-disposition”, “attachment; filename=”+filename+".xls");// 设定输出文件头
response.setContentType(“application/msexcel”);// 定义输出类型
————————————————
版权声明:本文为CSDN博主「weixin_43972670」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43972670/article/details/120525642

问题2:

说法1:
注意导出的controller中,不能有返回值,改为void,防止IO流冲突。

说法2:
controller添加返回值json后报错。
结论:下载文件时controller方法只能返回null或者void。
原因:因为response已经输出了,无论你返回不返回都没啥用了

解决方法:导出的接口调用返回null
    @GetMapping("/exportIMO/year")
    public ResponseResult exportImo(HttpServletResponse response, @RequestParam Integer year){
        Date firstDate = DateUtil.getYearFirst(year);
        Date lastDate = DateUtil.getAfterDay(DateUtil.getYearLast(year));
        if (!iImoVoyageService.isBeginPeriodOil(firstDate, lastDate)){
            return ResponseResult.fail("查询的开始时间和结束时间的期初存油均不能为空");
        }else {
            try {
                iImoVoyageService.exportIMOVoyageData(response,firstDate,lastDate,"1");
                return null;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

(8条消息) Java实现根据excel模板导出数据(适合导出结构复杂的excel)_名字看着办的博客-CSDN博客_java根据模板导出excel

7:百万数据量时,导出操作

使用EasyExcel实现excel导出,支持百万大数据量导出-----超简单_easyexcel导出大量数据_MCP~的博客-CSDN博客

POI百万级大数据量EXCEL导出_poi大数据量导出excel_请叫我猿叔叔的博客-CSDN博客

项目中Excel导出大数据量记录解决方案及实战(POI,Hutools,EasyExcel)_蜀山雪松的博客-CSDN博客

8:Java实现Excel转PDF的两种方法(spire和jacob):

https://blog.csdn.net/weixin_44985880/article/details/124293130?ops_request_misc=&request_id=&biz_id=102&utm_term=java%20excel%E8%BD%AC%E6%8D%A2%E4%B8%BApdf&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-124293130.142^v11^control,157^v12^control&spm=1018.2226.3001.4187
 

9:Spire.XLS将 Excel 转换为 CSV或将CSV转换为Excel:

https://blog.csdn.net/Augenstern__zyx/article/details/121607454?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165363799616782388025854%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165363799616782388025854&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-121607454-null-null.142^v11^control,157^v12^control&utm_term=java+excel%E8%BD%AC%E6%8D%A2%E4%B8%BAcsv&spm=1018.2226.3001.4187
 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于 Java 中的 ExcelWriter 转换为字节数组,可以使用 Apache POI 库来实现。下面是一个简单的示例代码,可以将 ExcelWriter 转换为字节数组: ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Workbook; // 创建一个简单的 ExcelWriter Workbook workbook = /* your workbook */; // 将 ExcelWriter 转换为字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } byte[] excelData = outputStream.toByteArray(); ``` 在这个示例中,我们首先创建了一个简单的 ExcelWriter,然后使用 ByteArrayOutputStream 将其转换为字节数组。注意,我们在调用 `workbook.write(outputStream)` 方法时,将输出流 `outputStream` 传递给了它,这样就可以将 ExcelWriter 写入到字节数组中了。 希望这个示例代码可以帮助你解决问题。如果还有什么不清楚的地方,欢迎继续向我提问。 ### 回答2: Java中的ExcelWriter是一个用于处理Excel文件的库,它提供了一种方便的方式来创建和编辑Excel文件。然而,ExcelWriter并不直接提供将Excel文件转换为字节数组的方法。 要将一个Excel文件转换为字节数组,我们需要借助其他的类库或方法来完成。常见的方法是使用Apache POI库来处理Excel文件。我们可以使用POI库中的Workbook类来读取Excel文件,并通过将数据写入到输出流中,将Excel文件转换为字节数组。下面是一个示例代码: ``` import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ExcelToByteArray { public static byte[] convertToByteArray(File excelFile) throws IOException { Workbook workbook = new XSSFWorkbook(new FileInputStream(excelFile)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); workbook.write(outputStream); workbook.close(); return outputStream.toByteArray(); } public static void main(String[] args) { File excelFile = new File("path/to/excel.xlsx"); try { byte[] byteArray = convertToByteArray(excelFile); // 处理字节数组的代码 } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的代码中,convertToByteArray方法接受一个Excel文件作为参数,使用POI库的Workbook类来读取Excel文件,然后将其写入到ByteArrayOutputStream中。最后,通过调用toByteArray方法将ByteArrayOutputStream转换为字节数组。 这样,我们就可以将Excel文件转换为字节数组,以便在需要的情况下进行进一步的处理和使用。 ### 回答3: Java中的ExcelWriter通常用于将数据写入Excel文件。然而,ExcelWriter并不能直接将Excel文件转换为字节数组。 通常情况下,将Excel文件转换为字节数组的常用方法是使用InputStream和OutputStream来进行文件的读取和写入操作。以下是一个可能的实现方法: 1. 首先,使用ExcelWriter来生成Excel文件,将数据写入文件中。 2. 创建一个File对象,指向生成的Excel文件。 3. 使用FileInputStream来读取文件的内容,并将其存储到字节数组中。这可以通过创建一个ByteArrayOutputStream对象,并将文件内容写入该对象来实现。 4. 最后,通过调用toByteArray()方法,将ByteArrayOutputStream对象转换为字节数组。 下面是一个示例代码: ```java import com.excel.*; public class ExcelToArray { public static void main(String[] args) { // 创建ExcelWriter对象并写入数据 ExcelWriter writer = new ExcelWriter(); writer.writeData(); // 将Excel文件转换为字节数组 try { File file = new File("path/to/excelFile.xlsx"); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { bos.write(buffer, 0, bytesRead); } byte[] excelBytes = bos.toByteArray(); // 关闭流 fis.close(); bos.close(); // 使用字节数组进行后续操作 // ... } catch (IOException e) { e.printStackTrace(); } } } ``` 此方法可以将Excel文件转换为字节数组,从而满足了将ExcelWriter转换为字节数组的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值