Excel转CSV格式

2023-11-09

注意: CSV文件导出来的 可以理解为 就是一个 普通的文件, 但至于使用什么样的软件打开就是另一马事了,比如Excel打开后 出来 “自动过滤了数字前面的0”,这玩意程序控制不到,那是Excel的事情。CSV不是Excel文件切记,只不过用表格软件打开CSV而已


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class ExclToCsv {

    public static void main(String[] args) throws Exception {
        excelToCsvBatch("C:\\tmp\\flowPool\\flowPool\\20211206150814");
    }

    /**
     * 将指定目录下的 Excel 文件转 csv格式文件
     * @param srcFilePath 目录地址
     */
    public static void excelToCsvBatch(String srcFilePath) {
        ArrayList<File> listFiles = getListFiles(srcFilePath);
        for(File file : listFiles){
            System.out.println(file.getParent()+file.getName().substring(0,file.getName().lastIndexOf(".")));
            ExclToCsv.excelToCsv(file.getPath(), file.getParent()+"\\"+file.getName().substring(0,file.getName().lastIndexOf("."))+".csv");
        }
    }

    /**
     * 获取指定目录下的所有的文件(不包括文件夹),采用了递归
     * @param obj 字符串路径 || File对象指向目录
     * @return 目录中所有文件的File对象
     */
    private static ArrayList<File> getListFiles(Object obj) {
        File directory = null;
        if (obj instanceof File) {
            directory = (File) obj;
        } else {
            directory = new File(obj.toString());
        }
        ArrayList<File> files = new ArrayList<File>();
        if (directory.isFile()) {
            files.add(directory);
            return files;
        } else if (directory.isDirectory()) {
            File[] fileArr = directory.listFiles();
            for (int i = 0; i < fileArr.length; i++) {
                File fileOne = fileArr[i];
                files.addAll(getListFiles(fileOne));
            }
        }
        return files;
    }

    /**
     * 将excel表格转成csv格式
     *
     * @param oldFilePath
     * @param newFilePath
     */
    public static void excelToCsv(String oldFilePath, String newFilePath) {
        String buffer = "";
        Workbook wb = null;
        Sheet sheet = null;
        Row row = null;
        Row rowHead = null;
        List<Map<String, String>> list = null;
        String cellData = null;
        String filePath = oldFilePath;

        wb = readExcel(filePath);
        if (wb != null) {
            for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                sheet = wb.getSheetAt(i);
                // 标题总列数
                rowHead = sheet.getRow(i);
                if (rowHead == null) {
                    continue;
                }
                //总列数colNum
                int colNum = rowHead.getPhysicalNumberOfCells();
                String[] keyArray = new String[colNum];
                Map<String, Object> map = new LinkedHashMap<>();

                //用来存放表中数据
                list = new ArrayList<Map<String, String>>();
                //获取第一个sheet
                sheet = wb.getSheetAt(i);
                //获取最大行数
                int rownum = sheet.getPhysicalNumberOfRows();
                //获取第一行
                row = sheet.getRow(0);
                //获取最大列数
                int colnum = row.getPhysicalNumberOfCells();
                for (int n = 0; n < rownum; n++) {
                    row = sheet.getRow(n);
                    for (int m = 0; m < colnum; m++) {
                        cellData = getCellFormatValue(row.getCell(m)).toString();
                        buffer += cellData;
                    }
                    buffer = buffer.substring(0, buffer.lastIndexOf(","));
                    buffer += "\n";
                }

                String savePath = newFilePath;
                File saveCSV = new File(savePath);
                try {
                    if (!saveCSV.exists()) {
                        saveCSV.createNewFile();
                    }
                    BufferedWriter writer = new BufferedWriter(new FileWriter(saveCSV));
                    writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
                    writer.write(buffer);
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }

    //读取excel
    public static Workbook readExcel(String filePath) {
        Workbook wb = null;
        if (filePath == null) {
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            if (".xls".equals(extString)) {
                return wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(extString)) {
                return wb = new XSSFWorkbook(is);
            } else {
                return wb = null;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }

    public static Object getCellFormatValue(Cell cell) {
        Object cellValue = null;
        if (cell != null) {
            //判断cell类型
            int cellType = cell.getCellType();
            switch (cell.getCellType()) {
                case Cell.CELL_TYPE_NUMERIC: {
                    String cellva = getValue(cell);
                    cellValue = cellva.replaceAll("\n", " ") + ",";
                    break;
                }
                case Cell.CELL_TYPE_FORMULA: {
                    //判断cell是否为日期格式
                    if (DateUtil.isCellDateFormatted(cell)) {
                        //转换为日期格式YYYY-mm-dd
                        cellValue = String.valueOf(cell.getDateCellValue()).replaceAll("\n", " ") + ",";
                    } else {
                        //数字
                        cellValue = String.valueOf(cell.getNumericCellValue()).replaceAll("\n", " ") + ",";
                    }
                    break;
                }
                case Cell.CELL_TYPE_STRING: {
                    cellValue = String.valueOf(cell.getRichStringCellValue()).replaceAll("\n", " ") + ",";
                    break;
                }
                default:
                    cellValue = "" + ",";
            }
        } else {
            cellValue = "" + ",";
        }
        return cellValue;
    }

    /**
     * 此方法为去掉转csv时数字等默认加上的小数点
     * 如果不需要刻意不调用此方法
     */
    public static String getValue(Cell hssfCell) {
        if (hssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            // 返回布尔类型的值
            return String.valueOf(hssfCell.getBooleanCellValue());
        } else if (hssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            // 返回数值类型的值
            Object inputValue = null;// 单元格值
            Long longVal = Math.round(hssfCell.getNumericCellValue());
            Double doubleVal = hssfCell.getNumericCellValue();
            if (Double.parseDouble(longVal + ".0") == doubleVal) {   //判断是否含有小数位.0
                inputValue = longVal;
            } else {
                inputValue = doubleVal;
            }
            DecimalFormat df = new DecimalFormat("#");    //在此处更改小数点及位数,按自己需求选择;
            return String.valueOf(df.format(inputValue));      //返回String类型
        } else {
            // 返回字符串类型的值
            return String.valueOf(hssfCell.getStringCellValue());
        }
    }

}

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

Excel转CSV格式 的相关文章

随机推荐

  • C二级考试第一套题

    一 1 题目 2 程序 考察范围 1 结构体的定义 关键字使用 2 链表节点的相关操作 3 malloc的应用 include
  • PyQt6 和 PyQt5 的差异

    PyQt6 和 PyQt5 的差异 PyQt6 是 PyQt5 的下一个版本 但两个版本的写法基本上其实大同小异 这篇教学会介绍 PyQt6 和 PyQt5 有何差异 快速预览 exec 改为 exec 方法的位置或名称改变 不需要高 DP
  • 行为型模式 - 迭代器模式iterator

    模式的定义与特点 迭代器模式 iterator Pattern 为的提是可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象 多个对象聚在一起形成的总体称之为聚集 聚集对象是能够包容一组对象的容器对象 迭代子模式将迭代逻辑封装到一个独立的子
  • 常见的智能指针

    智能指针其实是一个类模板 它与普通指针的区别在于他会自己释放内存空间 常见的智能指针有三种 unique ptr shared ptr weak ptr 他们都在头文件
  • Gradle到底是什么?

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具 它使用一种基于Groovy的特定领域语言来声明项目设置 而不是传统的XML 当前其支持的语言限于Java Groovy和Scala 计划未来将支持
  • java基础语法(二)

    3 java基础语法 3 1 注释 理解 注释是对代码的解释和说明文字 可以提高程序的可读性 因此在程序中添加必要的注释文字十分重要 Java中的注释分为三种 单行注释 单行注释的格式是使用 从 开始至本行结尾的文字将作为注释文字 这是单行
  • js正则表达式 必须包含数字、字母、指定特殊字符且不包含root

    js正则表达式要求 1 必须包含数字 大写字母 小写字母 特殊符号且长度在10到20之间 2 特殊符号包括 3 不包含root字符串 补充一下 有些朋友问到 最少包含2个大写字母 2个小写字母 2个数字 2个指定的特殊字符 长度10到20
  • FISCO BCOS(二)———配置及使用控制台

    1 准备依赖 安装java 推荐使用java 14 sudo apt install y default jdk 获取控制台并回到fisco目录 cd fisco curl LO https github com FISCO BCOS co
  • Spring Boot 多模块项目创建与配置

    最近在负责的是一个比较复杂项目 模块很多 代码中的二级模块就有9个 部分二级模块下面还分了多个模块 代码中的多模块是用maven管理的 每个模块都使用spring boot框架 之前有零零散散学过一些maven多模块配置的知识 但没自己从头
  • MATLAB 对多个数据自动寻峰/能谱图自动寻峰

    自动读取文件夹中的所有同类型数据文件 记录每个数据文件的峰值 并将所有峰值保存在excel中 数据是负的峰值类型 寻峰的逻辑是 设定一个阈值 0 002 挨个读取某一数据文件中的数据 如果当前数据大于阈值 则读取下一个数据 当当前数据小于阈
  • MANIFEST.MF文件作用及格式要求

    MANIFEST MF文件作用及格式要求 manifest mf文件格式如下 Manifest Version 1 0 Class Path xxx1 jar xxx2 jar xxx3 jar xxx4 jar xxx5 jar Main
  • 跨模态预训练迁移

    1 ViLD Zero Shot Detection via Vision and Language Knowledge Distillation code 2 OVR CNN Open Vocabulary Object Detectio
  • Tars源码分析---智能指针的实现

    前言 TC AutoPtr TC HandleBaseT 构造函数 赋值重载 析构函数 TC ScopedPtr TC SharedPtr tc shared count base tc shared count impl p tc sha
  • pycharm所有版本 http://www.jetbrains.com/pycharm/download/previous.html 打开激活窗口 选择 Activate new license

    pycharm所有版本 http www jetbrains com pycharm download previous html 打开激活窗口 选择 Activate new license with License server 用li
  • YAML学习笔记

    一 YAML概念 在运维日常工作中又很多遇到yaml 例如写ansible的playbook 利用yaml来定义创建各应用及服务 1 1 概念 YAML 发音 j m l 是一个类似 XML JSON 的数据序列化语言 YAML是专门用来写
  • HTTP Status 400 – Bad Request

    采用SpringMVC架构 写的一个简单的form请求 结果出错了 报错信息如下 Type Status Report Description The server cannot or will not process the reques
  • 计算机启动过程详解

    打开电源启动机器几乎是电脑爱好者每天必做的事情 面对屏幕上出现的一幅幅启动画面 我们一点儿也不会感到陌生 但是 计算机在显示这些启动画面时都做了些什么工作呢 相信有的朋友还不是很清楚 本文就来介绍一下从打开电源到出现Windows的蓝天白云
  • opencv源码阅读之——iOS的两条接口UIImageToMat()和MatToUIImage()

    转自 https www cnblogs com panxiaochun p 5387743 html 本文为作者原创 未经允许不得转载 原文由作者发表在博客园 http www cnblogs com panxiaochun p 5387
  • 小程序微信支付申请与配置完整版操作流程

    小程序微信支付申请与配置完整版操作流程 一 申请小程序微信支付 微信支付申请分为两种情况 情况一 申请新的微信支付商户号 情况二 绑定已有微信支付商户号 注意 申请微信支付的小程序账户需要进行微信认证 注册主体为个人的小程序目前暂不支持微信
  • Excel转CSV格式

    注意 CSV文件导出来的 可以理解为 就是一个 普通的文件 但至于使用什么样的软件打开就是另一马事了 比如Excel打开后 出来 自动过滤了数字前面的0 这玩意程序控制不到 那是Excel的事情 CSV不是Excel文件切记 只不过用表格软