首页 > 其他分享 >Excel转CSV格式

Excel转CSV格式

时间:2023-06-01 19:06:57浏览次数:43  
标签:CSV return String Excel cell new 格式 null wb


注意: 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());
        }
    }

}

标签:CSV,return,String,Excel,cell,new,格式,null,wb
From: https://blog.51cto.com/u_14671216/6397673

相关文章

  • Springboot整合EasyPOI操作Excel文件
    配合官网阅读本文源码POI官网文档效果图:本文只做一个案列的操作:pom依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--EasyPoi导入导......
  • .Net NPOI Excel 导出
    NPOI导出Excel最终效果图   环境:Revit,WPF,NPOI2.5.6,.NetFramework4.7.2一、引用NPOI 右击项目引用,选择"管理NuGet程序包",在浏览搜索NPOI,选择版本(我这里是2.5.6),安装   安装成功后,引用里会出现这四个引用(NPOI,NPOI.OOXML,NPOI.OpenXml......
  • vue xlsx组件 导出的excel表头插入内容
    主要就是sheet_add_dom这个方法,dom是带有table标签元素的dom节点。timeData是个二维数组:[["条件1","条件2"],["值1","值2"]];如果是要在表格内容行里面插入内容,可以直接在与表格绑定的对象上,插入内容就可以了。/*timeData是二维数组*/getExcelWithInfo(timeData,dom,tit......
  • Excel打印封装
    准备部分1、安装依赖npminstallvue-print-nb--save2、main.js全局安装importPrintfrom'vue-print-nb'Vue.use(Print);组件部分/components/ExcelForm.vue<template><div><divclass="btn"><el-buttonsize="......
  • 上万条美容知识大全ACCESS\EXCEL数据库
    今天采集了一个美容知识大全的网站,网站里的内容主要是美容化妆类的文章,分类有近百个,是个可以受女生喜欢的内容。截图包含所有字段。分类统计情况为:瘦腿方法(793)、美白(615)、瘦腰(583)、上班族(472)、抗衰老(453)、男士美容(421)、瘦脸(355)、翘臀(345)、防晒(256)、瘦臂(244)、补水(241)、保湿(229)、......
  • Pandas中将字符串(object)格式的列,强制转换为浮点型的列
    importpandasaspddf=pd.DataFrame([['11.0',1,2,3],['22.0',4,5,6],['33.0',7,8,9]],columns=['a','b','c','d'])df['a']=pd.......
  • 30万个名字汉字起名中文取名ACCESS\EXCEL数据库
    虽然汉字#起名名字#的数据库已经有一些,比如7千多汉字起名参考大典ACCESS数据库、汉字起名中文起名宝宝起名ACCESS数据库,但是今天发现了一个数据库,他是在《7千多汉字起名参考大典》的基础上增加了30万个男孩女孩的名字实例。非常适合于比如固定了名字的第二个字,取第三个字时一查就......
  • 规则引擎的低代码日记——自定义函数编程操作(类excel函数)
    它是技术源码可开放的JAVA规则引擎,采用springcloud+VUE的技术架构进行构建,其中对数据的灵活加工处理采用的是函数式编程的思路(类excel函数配置),是其亮点功能。它允许开发人员定义和管理应用程序的规则,并在应用程序中执行这些规则。在规则引擎中,从数据加工成变量并使用函数式编程......
  • 3万5千英语句子英语例句大全ACCESS\EXCEL数据库
    在学习英语的过程中可能会发现没有比较适合自己的英语学习软件,适合你的软件不一定适合我,竟毕每个人的学习方法不尽相同。这个数据库收集了40多个课程,35000多个句子。是学习英语的必备资料。分类表:包含电话英语、旅游英语、求职英语、商务英语、社交英语、洋话连篇、走遍美国、灵......
  • 2万多汉字组词词组大全ACCESS\EXCEL数据库
    本数据库是由MicrosoftAccess2000创建的MDB数据库文件,您需要使用MicrosoftAccess2000或以上版本打开这个文件。可以通过到Access中全选复制,然后到Excel中粘贴立即转为XLS文件,也可以在Access中导出成其他格式文件。包含有近5千个常用字的组词,字段组词前面的10\20\30\40......