java代码实现csv转xls并设置单元格为string类型

一、前言

  • 1.一般从生产数据库导出报表,导出的是csv文件
  • 2.用excel打开csv文件时,有些首字母为0的数据(例如员工工号),会被省略不显示;然后需要另存为xls、进行后续报表处理时,就会丢失开头的0
  • 3.为了解决这个问题,用这个java可以把csv转为xls、并设置单元格格式为string类型,就可以防止丢失开头的0

二、需要的jar包

commons-collections4-4.1.jar
poi-3.17.jar
poi-ooxml-3.17.jar
poi-ooxml-schemas-3.17.jar
xmlbeans-3.1.0.jar

三、完整代码

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * csv转xls
 *
 * 1.一般从生产数据库导出报表,导出的是csv文件
 * 2.用excel打开csv文件时,有些首字母为0的数据(例如员工工号),会被省略不显示;然后需要另存为xls、进行后续报表处理时,就会丢失开头的0
 * 3.为了解决这个问题,用这个java可以把csv转为xls、并设置单元格格式都是string类型,就可以防止丢失开头的0
 *
 */

public class CsvToXls {
    public static void main(String[] args) throws Exception {

        //自测用,本人的csv用逗号分隔了
        args = new String[]{",","D:/1.csv","D:/1.xls"};

        //csv分隔符
        String csvSplitWord = args[0];
        if("space".equals(csvSplitWord)){
            csvSplitWord=" ";
        }
        //csv文件名,输入用
        String csvPath = args[1];

        //xls文件名,输出用
        String xlsPath = args[2];

        //把csv的内容读取到list里
        ArrayList<List<String>> row = readCsv(csvSplitWord, csvPath, xlsPath);
        writeXls(row,xlsPath);
        System.out.println("csv转xls完成");

    }

    /**
     * 读取csv文件,一般分隔符是空格,也可能是逗号
     */
    private static ArrayList<List<String>> readCsv(String csvSplitWord, String csvPath, String xlsPath) throws Exception {

        //装在List里
        ArrayList<List<String>> row = new ArrayList<>();


        File file = new File(csvPath);
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String line = "";
        while((line = bufferedReader.readLine())!= null){

            String[] split = line.split(csvSplitWord);
            //每个格子
            List<String> unit = Arrays.asList(split);
            row.add(unit);
        }

        return row;
    }

    /**
     * 保存为xls文件,设置所有单元格的格式为string,防止开头的0丢失
     */
    private static void writeXls(ArrayList<List<String>> row, String xlsPath) throws Exception {

        XSSFWorkbook wb = new XSSFWorkbook();

        //准备好单元格格式
        XSSFCellStyle strCellStyle= wb.createCellStyle();
        //CellType.STRING,里面写着1就是String格式
        strCellStyle.setDataFormat(1);

        XSSFSheet sheet = wb.createSheet("csvToXls");
        for(int i=0;i<row.size();i++){
            XSSFRow xssfRow = sheet.createRow(i);
            for(int j=0;j<row.get(i).size();j++){
                XSSFCell cell = xssfRow.createCell(j);
                //本人的csv里每个单元格开头和结尾有个双引号,所以就这样搞了一下去掉
                cell.setCellValue(row.get(i).get(j).substring(1,row.get(i).get(j).length()-1));
                //这个报错了
                //cell.setCellStyle(CellType.STRING);
                //用这个了
                cell.setCellStyle(strCellStyle);
            }
        }

        FileOutputStream fileOutputStream = new FileOutputStream(xlsPath);
        wb.write(fileOutputStream);
        wb.close();

    }

}

三、备注

1.代码中,本人的csv用,分隔了,可以根据实际情况自己调整。

2.代码中,本人的csv单元格开头与结尾有个",所以用row.get(i).get(j).substring(1,row.get(i).get(j).length()-1)截取了下,可以根据实际情况自己调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值