java生成excel文件并写入数据(附csv)

2023-11-05

写一个超级简单粗暴的小代码了,直接看吧

public static void createxlsFile(String filePath,String fileName,String suffix,Map<String,Object> colsLab,List<Map<String,Object>> data) {
        String fileAbsolutePath=filePath+File.separator+fileName+"."+suffix;
        File file = new File(fileAbsolutePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        //创建工作薄对象
        HSSFWorkbook workbook=new HSSFWorkbook();//这里也可以设置sheet的Name
        //创建工作表对象
        HSSFSheet sheet = workbook.createSheet();
        //创建工作表的行
        HSSFRow row = sheet.createRow(0);//设置第一行,从零开始
        Set<Map.Entry<String, Object>> entries = colsLab.entrySet();
        //相反数
        int colSize=Math.negateExact(entries.size());
        //标记每一个key对应的cell的列位置
        Map<String,Integer> tag=new HashMap<>();
        for (Map.Entry<String, Object> entry: entries) {
            int cellPosition=colSize+entries.size();
            row.createCell(cellPosition).setCellValue(entry.getValue().toString());//第
            tag.put(entry.getKey(),cellPosition);
            colSize++;
        }
        for(int i=0;i<data.size();i++){
            HSSFRow dataRow = sheet.createRow(i+1);//设置第一行,从1开始
            Set<Map.Entry<String, Object>> dataEntries = data.get(i).entrySet();
            for (Map.Entry<String, Object> entry: dataEntries) {
                //创建对应的列且赋值数据
                HSSFCell cell = dataRow.createCell(tag.get(entry.getKey()));
                cell.setCellValue(entry.getValue().toString());
            }
        }
        //文档输出
        try(FileOutputStream out = new FileOutputStream(fileAbsolutePath)){
            workbook.write(out);
        }catch (Exception e){
            e.printStackTrace();
        };
    }

csv格式生成代码如下:参考其他人的改了关于值空情况与当前cell内容为大字段情况遇到的文本换行问题。传入数据格式与xls相同

 public File createCSVFile(List exportData, LinkedHashMap map, String outPutPath,
                              String fileName) {
        File csvFile = null;
        BufferedWriter csvFileOutputStream = null;
        try {
            File file = new File(outPutPath);
            if (!file.exists()) {
                file.mkdirs();
            }
            //定义文件名格式并创建
            csvFile = new File(outPutPath + fileName + ".csv");
            file.createNewFile();
            // UTF-8使正确读取分隔符","
            //如果生产文件乱码,windows下用gbk,linux用UTF-8
            csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
                    csvFile), "UTF-8"), 1024);

            // 写入文件头部
            for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext(); ) {
                java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
                csvFileOutputStream.write((String) propertyEntry.getValue() != null ? (String) propertyEntry.getValue() : "");
                if (propertyIterator.hasNext()) {
                    csvFileOutputStream.write(",");
                }
            }
            csvFileOutputStream.newLine();
            // 写入文件内容
            for (Iterator iterator = exportData.iterator(); iterator.hasNext(); ) {
                Object row = (Object) iterator.next();
                if (ObjectUtil.isNull(row)) {
                    continue;
                }
                for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
                        .hasNext(); ) {
                    java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
                            .next();
                    Object cellData = ((Map) row).get(propertyEntry.getKey());
                    String str = ObjectUtil.isNotNull(cellData) ? String.valueOf(cellData) : "";
                    if (StringUtil.isBlank(str) || StringUtils.isEmpty(str)) {
                        str = "";
                    } else {
                        //ps:由于csv文件主要采用都好进行分割因此保证数据中\加双引号都好加双引号,换行符去掉。
                        str = str.replaceAll("\r|\n", "").replaceAll("\"", "\"\"").replaceAll(",", "\"\"");;
                        //字符串以0开头的数据在Excel中会自动去0,避免此问题用=""替换如0009->="0009"既可原样展示
                        if(str.startsWith("0")){
                            str="="+'"'+str+'"';
                        }
                    }
                    csvFileOutputStream.write(str);
                    if (propertyIterator.hasNext()) {
                        csvFileOutputStream.write(",");
                    }
                }
                if (iterator.hasNext()) {
                    csvFileOutputStream.newLine();
                }
            }
            csvFileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                csvFileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return csvFile;
    }

对应的测试类如下

public static void main(String[] args) {
        List exportData = new ArrayList<Map>();
        Map row1 = new LinkedHashMap<String, String>();
        row1.put("one",  "shuju");
        row1.put("two",  "nn");
        row1.put("three", "sf");
        row1.put("four", "zhang");
        exportData.add(row1);
        row1 = new LinkedHashMap<String, String>();
        row1.put("two",  "啊我几个");
        row1.put("one",  "凡是敌人");
        row1.put("four", "放到");
        row1.put("three", "发");
        exportData.add(row1);
        LinkedHashMap map = new LinkedHashMap();

        //设置列名
        map.put("two", "第二列名称");
        map.put("one", "第一列名称");
        map.put("four", "第四列名称");
        map.put("three", "第三列名称");
        //这个文件上传到路径,可以配置在数据库从数据库读取,这样方便一些!
        String path = "E:/";

        //文件名=生产的文件名称+时间戳
        String fileName = "文件导出";
         createxlsFile(path,fileName,"xls",map,exportData );
//        String fileName2 = file.getName();
//        System.out.println("文件名称:" + fileName2);
    }

记住啊,保证列顺序的话就用LinkedHashMap,over

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java生成excel文件并写入数据(附csv) 的相关文章

随机推荐

  • 连接打印机出现0x0000007e错误的解决方法

    办公室用自己电脑连接公共服务器打印机时 出现出现0x0000007e错误 查找了微软论坛 解决方案如下 删除服务器电脑注册表中的copyfiles项 具体路径如下 registry gt Local Machine gt system gt
  • element组件库的el-select多选时候,选择三个时候下拉框抖动问题解决办法

    添加如下样式即可解决
  • 华为OD机试真题- 寻找链表的中间结点【2023Q1】【JAVA、Python、C++】

    题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点 则输出第二个中间结点保存的数据 例如 给定 L 为 1 7 5 则输出应该为 7 给定 L 为 1 2 3 4 则输出应该为 3 输入描述 每个输入包
  • php mysql layui分页_php+layui数据表格实现数据分页渲染代码

    一 HTML 二 JS 说明 需要引入layui中的table和laytpl模板引擎 laytpl可以自定义事件及自定义数据字段等 查看详情 if d hotcake 超级爆款 d hotcake else if d hotcake 大爆款
  • resultType和parameterType的基本使用和区别

    resultType与parameterType的基本使用和区别 Mybatis的Mapper文件中的select insert update delect元素中都有一个parameterType和resultType属性 paramete
  • MQ 入门实践

    MQ Message Queue 消息队列 FIFO 结构 例如电商平台 在用户支付订单后执行对应的操作 优点 异步 削峰 解耦 缺点 增加系统复杂性 数据一致性 可用性 JMS Java Message Service Java消息服务
  • ajax详细用法

    一 基础知识 1 首先让我们了解ajax 通过在后台与服务器进行少量数据交换 AJAX 可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 对网页的某部分进行更新 2 ajax的核心步骤 创建XMLHttpRequest对象
  • Android读取联系人的姓名及电话号码

    Android中联系人的信息是通过ContentProvider来供外部应用获取的 我们使用时只需根据系统联系人ContentProvider的Uri即可获取所需数据 下面讲解如何获取联系人的姓名及电话号码 别的数据如邮箱 照片等数据的获取
  • flutter开发中常用的dart插件

    本文罗列了一些在用flutter进行移动开发时经常会用到的插件 flutter插件官网地址 https pub dartlang org packages 1 image picker 一个可以从图库选择图片 并可以用相机拍摄新照片的flu
  • 关于Java中序列化Serializable的简单注解

    最近学校的实训课程在学习ssm框架 其中有一点实体类里面实现了Serializable序列化的方法 查了一下 仍然有点模糊 序列化和数据库中的字段有关 方便数据存储和传输 import java io Serializable public
  • 计算机专业毕业设计题目大全

    计算机专业毕业设计题目大全 一 ASP类计算机专业毕业设计题目 文章目录 计算机专业毕业设计题目大全 一 ASP类计算机专业毕业设计题目 ASP NET类计算机专业毕业设计题目 Delphi类计算机专业毕业设计题目 JAVA类计算机专业毕业
  • 2020 AI产业图谱启动,勾勒中国AI技术与行业生态

    2020年国务院政府工作报告 提出 重点支持 两新一重 建设 其中 两新一重 中的第一个 新 就是新基建 而人工智能是新基建的重要组成部分 新基建首次被纳入政府工作报告后 各大科技厂商纷纷押注 重金投向 新基建 例如腾讯已经宣布未来五年将投
  • 网络问题导致的github提交失败解决方案

    参考文章 github push过程中的timeout问题 码农家园 1 打开 C Windows System32 drivers etc 下的hosts文件 2 访问 github global ssl Fastly net Serve
  • 质量成本(一致性成本和非一致性成本)

    项目管理知识体系指南第四版 PMBOK2008 8 1 2 2 质量成本 质量成本包括在产品生命周期中为预防不符合要求 为评价产品或服务是否符合要求 以及因未达到要求 而发生的所有成本 质量成本 一致性成本和非一致性成本 一致性成本包括预防
  • 机器学习环境的搭建(miniconda+pycharm)

    一 Python语言环境的安装 miniconda 1 软件安装 直接去官网下载Miniconda速度太慢 建议去清华开源找一个替代的镜像下载 并且在清华该网站上面 还有附带的一些镜像使用帮助 2 anaconda与miniconda的区别
  • STM32CubeMx采集多路ADC

    转载于https blog csdn net qq 24815615 article details 70227385 原文地址https www eemaker com stm32cubemxadc html 单片机为 STM32F103
  • IntelliJ IDEA 好用的插件

    IntelliJ IDEA 好用的插件 1 Maven Helper Maven Helper插件可以方便显示maven的依赖树和方便解决依赖冲突问题 2 Alibaba Java Coding Guidelines Alibaba Jav
  • @FeignClient Get请求、实体参数,自动转POST请求问题

    问题 报错提示不支持POST请求 解决 使用SpringCloud2 1以上版本提供的 SpringQueryMap注解标注在实体对象参数后解决 导入注解包路径 import org springframework cloud openfe
  • lapack安装 matlab,调用 LAPACK 和 BLAS 函数

    将参数从 Fortran 程序传递给 Fortran 函数 您可以从 Fortran MEX 文件中调用 LAPACK 和 BLAS 函数 以下示例使用两个矩阵 并通过调用 BLAS 例程 dgemm 将这两个矩阵相乘 要运行该示例 请将代
  • java生成excel文件并写入数据(附csv)

    写一个超级简单粗暴的小代码了 直接看吧 public static void createxlsFile String filePath String fileName String suffix Map