工作需求:需要在Spark中读取Excel文件,但是xls文件读取不了,所以需要转成CSV。
转换:只需要挨个将xls文件的单元格数据读取出来以后,加上英文逗号,追加到StringBuffer中即可,待完成所有数据的读取,最后将buffer写入到文件中。
但是有一个小小的陷阱需要注意:那就是在xls文件中,某个单元格内的内容有可能存在换行问题,因此需要置换每行的数据(除了每行的结束)以外所有换行符”\n”,不然生成的csv是无法使用的。
开发环境:maven
使用工具:JXL
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
代码如下:
public class ExcelToCsv {
public static void main(String[] args) throws IOException, BiffException {
String buffer = "";
String fileName = "F:\\ChineseAll\\test.xls";
File file = new File(fileName);
//设置文件编码
WorkbookSettings setEncode = new WorkbookSettings();
setEncode.setEncoding("gb2312");
//从文件流中获取Excel工作区对象(workbook)
Workbook wb = Workbook.getWorkbook(file,setEncode);
Sheet sheet = wb.getSheet(0);
for(int i=0;i<sheet.getRows();i++){
for(int j = 1;j < 21;j++){
Cell cell = sheet.getCell(j,i);
buffer += cell.getContents().replaceAll("\n"," ")+",";
}
buffer = buffer.substring(0,buffer.lastIndexOf(",")).toString();
buffer += "\n";
}
String savePath = "F:\\ChineseAll\\trans.csv";
File saveCSV = new File(savePath);
if(!saveCSV.exists()){
saveCSV.createNewFile();
}
BufferedWriter writer = new BufferedWriter(new FileWriter(saveCSV));
writer.write(buffer);
writer.close();
}
}
程序运行报错:
Exception in thread "main" jxl.read.biff.BiffException: Unable to recognize OLE stream
at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
at jxl.read.biff.File.<init>(File.java:127)
at jxl.Workbook.getWorkbook(Workbook.java:221)
at test.ExcelToCsv.main(ExcelToCsv.java:24)
经过上网查找资料,发现异常原因是:文件是Excel2007,而jxl解析07会上报异常,也就是jxl可以处理Excel2003.
解决办法:打开文件,右上角文件另存为,选类型2003文件