java代码实现excel文件转换为csv文件

pom文件导入

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency><dependency><groupId>net.sf.opencsv</groupId><artifactId>opencsv</artifactId><version>2.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version><type>pom</type></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.7</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>
</dependencies>

文件转换类ExcelToCsv直接调用里面方法

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import java.io.*;
import java.util.Locale;
/*** @ClassName: ExcelToCsv* @Description:转换excel成csv格式* @Author: mashiwei*/
public class ExcelToCsv {/***将excel(xls/xlsx)转换成csv文件* @param excelFile* @param csvFile* @return String*/public static String getCsv(String excelFile, String csvFile) {//.xlsx文件后缀转成csvif (excelFile.endsWith(".xlsx")){XLSX2CSV.trans(excelFile,csvFile);return csvFile;}//.xls文件后缀转成csvelse {try {OutputStream os = new FileOutputStream(new File(csvFile));OutputStreamWriter osw = new OutputStreamWriter(os, "UTF8");BufferedWriter bw = new BufferedWriter(osw);// 载入Excel文件WorkbookSettings ws = new WorkbookSettings();ws.setLocale(new Locale("en", "EN"));Workbook wk = Workbook.getWorkbook(new File(excelFile), ws);// 从工作簿(workbook)取得每页(sheets)for (int sheet = 0; sheet < wk.getNumberOfSheets(); sheet++) {Sheet s = wk.getSheet(sheet);Cell[] row = null;// 从每页(sheet)取得每个区块(Cell)for (int i = 0; i < s.getRows(); i++) {row = s.getRow(i);if (row.length > 0) {bw.write(row[0].getContents());for (int j = 1; j < row.length; j++) {//写入分隔符bw.write(',');bw.write(row[j].getContents());}}bw.newLine();}}bw.flush();bw.close();} catch (Exception e) {System.err.println(e.toString());e.printStackTrace();}return csvFile;}}
}

XLSX2CSV类,用来处理文件

import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.ss.usermodel.BuiltinFormats;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;public class XLSX2CSV {/*** The type of the data value is indicated by an attribute on the cell. The* value is usually in a "v" element within the cell.*/enum xssfDataType {BOOL, ERROR, FORMULA, INLINESTR, SSTINDEX, NUMBER,}class MyXSSFSheetHandler extends DefaultHandler {/*** Table with styles*/private StylesTable stylesTable;/*** Table with unique strings*/private ReadOnlySharedStringsTable sharedStringsTable;/*** Destination for data*/private final PrintStream output;/*** Number of columns to read starting with leftmost*/private final int minColumnCount;// Set when V start element is seenprivate boolean vIsOpen;// Set when cell start element is seen;// used when cell close element is seen.private xssfDataType nextDataType;// Used to format numeric cell values.private short formatIndex;private String formatString;private final DataFormatter formatter;private int thisColumn = -1;// The last column printed to the output streamprivate int lastColumnNumber = -1;// Gathers characters as they are seen.private StringBuffer value;public MyXSSFSheetHandler(StylesTable styles,ReadOnlySharedStringsTable strings, int cols, PrintStream target) {this.stylesTable = styles;this.sharedStringsTable = strings;this.minColumnCount = cols;this.output = target;this.value = new StringBuffer();this.nextDataType = xssfDataType.NUMBER;this.formatter = new DataFormatter();}public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {vIsOpen = true;// Clear contents cachevalue.setLength(0);}// c => cellelse if ("c".equals(name)) {// Get the cell referenceString r = attributes.getValue("r");int firstDigit = -1;for (int c = 0; c < r.length(); ++c) {if (Character.isDigit(r.charAt(c))) {firstDigit = c;break;}}thisColumn = nameToColumn(r.substring(0, firstDigit));// Set up defaults.this.nextDataType = xssfDataType.NUMBER;this.formatIndex = -1;this.formatString = null;String cellType = attributes.getValue("t");String cellStyleStr = attributes.getValue("s");if ("b".equals(cellType))nextDataType = xssfDataType.BOOL;else if ("e".equals(cellType))nextDataType = xssfDataType.ERROR;else if ("inlineStr".equals(cellType))nextDataType = xssfDataType.INLINESTR;else if ("s".equals(cellType))nextDataType = xssfDataType.SSTINDEX;else if ("str".equals(cellType))nextDataType = xssfDataType.FORMULA;else if (cellStyleStr != null) {// It's a number, but almost certainly one// with a special style or formatint styleIndex = Integer.parseInt(cellStyleStr);XSSFCellStyle style = stylesTable.getStyleAt(styleIndex);this.formatIndex = style.getDataFormat();this.formatString = style.getDataFormatString();if (this.formatString == null)this.formatString = BuiltinFormats.getBuiltinFormat(this.formatIndex);}}}public void endElement(String uri, String localName, String name)throws SAXException {String thisStr = null;// v => contents of a cellif ("v".equals(name)) {// Process the value contents as required.// Do now, as characters() may be called more than onceswitch (nextDataType) {case BOOL:char first = value.charAt(0);thisStr = first == '0' ? "FALSE" : "TRUE";break;case ERROR:
//                        thisStr = "\"ERROR:" + value.toString() + '"';thisStr = "\"ERROR:" + value.toString() + '"';break;case FORMULA:// A formula could result in a string value,// so always add double-quote characters.
//                        thisStr = '"' + value.toString() + '"';thisStr =  value.toString();break;case INLINESTR:// TODO: have seen an example of this, so it's untested.XSSFRichTextString rtsi = new XSSFRichTextString(value.toString());
//                        thisStr = '"' + rtsi.toString() + '"';thisStr = rtsi.toString();break;case SSTINDEX:String sstIndex = value.toString();try {int idx = Integer.parseInt(sstIndex);XSSFRichTextString rtss = new XSSFRichTextString(sharedStringsTable.getEntryAt(idx));
//                            thisStr = '"' + rtss.toString() + '"';thisStr = rtss.toString() ;} catch (NumberFormatException ex) {output.println("Failed to parse SST index '" + sstIndex+ "': " + ex.toString());}break;case NUMBER:String n = value.toString();if (this.formatString != null)thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex,this.formatString);elsethisStr = n;break;default:
//                        thisStr = "(TODO: Unexpected type: " + nextDataType + ")";thisStr = "(TODO: Unexpected type: " + nextDataType + ")";break;}// Output after we've seen the string contents// Emit commas for any fields that were missing on this rowif (lastColumnNumber == -1) {lastColumnNumber = 0;}for (int i = lastColumnNumber; i < thisColumn; ++i)output.print(',');// Might be the empty string.output.print(thisStr);// Update columnif (thisColumn > -1)lastColumnNumber = thisColumn;} else if ("row".equals(name)) {// Print out any missing commas if neededif (minColumns > 0) {// Columns are 0 basedif (lastColumnNumber == -1) {lastColumnNumber = 0;}for (int i = lastColumnNumber; i < (this.minColumnCount); i++) {output.print(',');}}// We're onto a new rowoutput.println();lastColumnNumber = -1;}}public void characters(char[] ch, int start, int length)throws SAXException {if (vIsOpen)value.append(ch, start, length);}private int nameToColumn(String name) {int column = -1;for (int i = 0; i < name.length(); ++i) {int c = name.charAt(i);column = (column + 1) * 26 + c - 'A';}return column;}}private OPCPackage xlsxPackage;private int minColumns;private PrintStream output;private final String OUTPUT_CHARSET = "GBK";/*** Creates a new XLSX -> CSV converter** @param pkg*            The XLSX package to process* @param output*            The PrintStream to output the CSV to* @param minColumns*            The minimum number of columns to output, or -1 for no minimum*/public XLSX2CSV(OPCPackage pkg, PrintStream output, int minColumns) {this.xlsxPackage = pkg;this.output = output;this.minColumns = minColumns;}//TODO catch exceptionspublic XLSX2CSV(String inputFilePath, String outputFilePath) throws Exception {xlsxPackage = OPCPackage.open(inputFilePath, PackageAccess.READ);output = new PrintStream(outputFilePath, OUTPUT_CHARSET);minColumns = -1;}/*** Parses and shows the content of one sheet using the specified styles and* shared-strings tables.** @param styles* @param strings* @param sheetInputStream*/public void processSheet(StylesTable styles,ReadOnlySharedStringsTable strings, InputStream sheetInputStream)throws IOException, ParserConfigurationException, SAXException {InputSource sheetSource = new InputSource(sheetInputStream);SAXParserFactory saxFactory = SAXParserFactory.newInstance();SAXParser saxParser = saxFactory.newSAXParser();XMLReader sheetParser = saxParser.getXMLReader();ContentHandler handler = new MyXSSFSheetHandler(styles, strings,this.minColumns, this.output);sheetParser.setContentHandler(handler);sheetParser.parse(sheetSource);}public void process() throws IOException, OpenXML4JException,ParserConfigurationException, SAXException {ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(this.xlsxPackage);XSSFReader xssfReader = new XSSFReader(this.xlsxPackage);StylesTable styles = xssfReader.getStylesTable();XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();int index = 0;while (iter.hasNext()) {InputStream stream = iter.next();String sheetName = iter.getSheetName();
//            this.output.println();
//            this.output.println(sheetName + " [index=" + index + "]:");processSheet(styles, strings, stream);stream.close();++index;}}public static void trans(String fileInput,String fileOutput){XLSX2CSV xlsx2csv = null;try {xlsx2csv = new XLSX2CSV(fileInput, fileOutput);} catch (Exception e) {e.printStackTrace();}try {xlsx2csv.process();} catch (IOException e) {e.printStackTrace();} catch (OpenXML4JException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}}
}

效果展示

类来自于网络,侵权即删。

java代码实现excel文件转换为csv文件相关推荐

  1. Python之EXCEL文件转换为CSV文件

    Python之EXCEL文件转换为CSV文件@TOC 依赖库:pandas.pathlib.os,Python版本3.9.7 手头有10000+的excel文件,每个文件只有一个sheet,10000 ...

  2. psv文件转换为csv文件

    最近在获取physionet.org网站的数据时,发现是psv文件存储的,虽然网站提供了基于os.argv数据流形式的处理方式,但是由于tensorflow的环境太难配置了,懒得配,所以写了个代码,进 ...

  3. 数据集处理----将.dat文件转换为.csv文件

    在训练数据集时,里面的数据通常以.data格式存储,在将数据集中的字符串转化为浮点型时出现了以下错误: could not convert string to float: 'temp' 上网查了写资 ...

  4. python excel转csv_python脚本-excel批量转换为csv文件

    pandas和SQL数据分析实战视频教程 # -*- coding: utf-8 -*- """ Created on Mon Apr 4 18:04:06 2016 @ ...

  5. python将json文件转换为csv文件

    需要通过引入json和csv库,然后根据以下步骤进行操作: 一.读取json文件.创建csv文件 二.提出json中表头和表的内容 三.使用csv.reader(读取器)写入csv内容 四.关闭jso ...

  6. ssconvert 安装_使用Gnumeric ssconvert将ods文件转换为csv文件时替换或忽略换行符

    这是你的问题: ssconvert -O' separator =; quoting-mode = never'"f.ods""f.txt"; 通过阻止ssco ...

  7. 如何使用python把json文件转换为csv文件

    文章目录 了解json整体格式 转换格式 提取key和value 使用pandas写入csv 了解json整体格式 这里有一段json格式的文件,存着全球陆地和海洋的每年异常气温(这里只选了一部分): ...

  8. 将.dat文件转换为csv文件

    程序很简单,下面贴代码: #coding=utf-8 import pandas as pd import os path1= os.getcwd()+ '/20161201.dat'        ...

  9. php xlsx格式转换csv,我想使用C将.xls或.xlsx文件转换为.csv格式#

    我试图用C编写代码,将.xls/.xlsx文件转换为.csv文件,打开文件后将其保存为.csv文件,但结果文件仍然具有所有Excel属性(如合并单元格.标题等),但当我查看属性时,它将文件类型显示为. ...

最新文章

  1. NLP突破性成果 BERT 模型详细解读 bert参数微调
  2. Java SE 6之GUI:让界面更加绚丽(上)
  3. VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget
  4. 数学之路(2)-数据分析-R基础(1)
  5. import package的问题
  6. 牛客网【每日一题】4月17日题目精讲 华华给月月准备礼物
  7. mysql 导出数据库中的某张数据表_mysql 导出数据库中的某张数据表
  8. 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍
  9. 特征编码1 - 特征编码概述与分类
  10. 敏捷开发一千零一问系列之六:业务人员怎样参与开发?
  11. java自定义窗口_Java-创建一个自定义窗口,扁平化界面
  12. python lambda菜鸟教程_Python - lambda函数
  13. TM1640的驱动及代码
  14. Android 面试题
  15. Nmap命令详解(全)
  16. PHP连接mssql的配置
  17. 超实用PCB布线技巧,菜鸟和老司机都应该知道!
  18. 广东工业大学acm校赛总结(基础差的人的自我觉悟)
  19. TS 对象可能为“未定义”,不能将类型“ XXXX | undefined “分配给类型{ xxxx }
  20. 免费下载Xcode的各个版本

热门文章

  1. java web框架struts_Struts框架在Web开发中的应用
  2. Python办公自动化之Excel做表自动化
  3. AirPods 充电接触不良问题修复
  4. 技术解读:腾讯优图12篇论文入选 ICCV 2017
  5. PHP程序判断星座,php根据日期判断星座的函数分享
  6. 浏览器中的performance检测页面性能
  7. cs231n_assignment1_配置作业环境+kNN
  8. 内部推荐!陌陌深度学习实验室招聘算法实习生
  9. 坦克大战系列一:从零编写【坦克大战】
  10. CDH集群下hadoop异常PriviledgedActionException as:root (auth:SIMPLE)解决