一、前言
- 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)
截取了下,可以根据实际情况自己调整。