难点在于Date日期类型的转化,需要采用

//.xls:
numrec.getXFIndex() == 62//.xlsx:
this.formatIndex == 31

判断日期类型,并结合 DateUtil.getJavaDate进行时间解析:

//.xls:
new SimpleDateFormat("yyyy年MM月dd日").format(DateUtil.getJavaDate(numrec.getValue()));
//.xls:
new SimpleDateFormat("yyyy年MM月dd日").format(DateUtil.getJavaDate(Double.parseDouble(n)));

.xls 转 csv

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.LabelRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.NoteRecord;
import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.RKRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.DateUtil;public class XLS2CSV implements HSSFListener{private int minColumns;private POIFSFileSystem fs;private PrintStream output;private int lastRowNumber;private int lastColumnNumber;/** Should we output the formula, or the value it has? */private boolean outputFormulaValues = true;/** For parsing Formulas */private SheetRecordCollectingListener workbookBuildingListener;private HSSFWorkbook stubWorkbook;// Records we pick up as we processprivate SSTRecord sstRecord;private FormatTrackingHSSFListener formatListener;/** So we known which sheet we're on */private int sheetIndex = -1;private BoundSheetRecord[] orderedBSRs;private ArrayList boundSheetRecords = new ArrayList();// For handling formulas with string resultsprivate int nextRow;private int nextColumn;private boolean outputNextStringRecord;private final String OUTPUT_CHARSET = "GBK";private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");/*** Creates a new XLS -> CSV converter** @param fs*            The POIFSFileSystem 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 XLS2CSV(POIFSFileSystem fs, PrintStream output, int minColumns) {this.fs = fs;this.output = output;this.minColumns = minColumns;}public XLS2CSV(String inputFilePath, String outputFilePath) throws Exception {fs = new POIFSFileSystem(new FileInputStream(inputFilePath));output = new PrintStream(outputFilePath, OUTPUT_CHARSET);minColumns = -1;}/*** Creates a new XLS -> CSV converter** @param filename*            The file to process* @param minColumns*            The minimum number of columns to output, or -1 for no minimum* @throws IOException* @throws FileNotFoundException*/public XLS2CSV(String filename, int minColumns) throws IOException,FileNotFoundException {this(new POIFSFileSystem(new FileInputStream(filename)), System.out,minColumns);}/*** Initiates the processing of the XLS file to CSV*/public void process() throws IOException {MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);formatListener = new FormatTrackingHSSFListener(listener);HSSFEventFactory factory = new HSSFEventFactory();HSSFRequest request = new HSSFRequest();if (outputFormulaValues) {request.addListenerForAllRecords(formatListener);} else {workbookBuildingListener = new SheetRecordCollectingListener(formatListener);request.addListenerForAllRecords(workbookBuildingListener);}factory.processWorkbookEvents(request, fs);}/*** Main HSSFListener method, processes events, and outputs the CSV as the* file is processed.*/public void processRecord(Record record) {int thisRow = -1;int thisColumn = -1;String thisStr = null;//System.out.println(record.getSid());switch (record.getSid()) {case BoundSheetRecord.sid://boundSheetRecords.add(record);break;case BOFRecord.sid:BOFRecord br = (BOFRecord) record;if (br.getType() == BOFRecord.TYPE_WORKSHEET) {// Create sub workbook if requiredif (workbookBuildingListener != null && stubWorkbook == null) {stubWorkbook = workbookBuildingListener.getStubHSSFWorkbook();}// Output the worksheet name// Works by ordering the BSRs by the location of// their BOFRecords, and then knowing that we// process BOFRecords in byte offset ordersheetIndex++;if (orderedBSRs == null) {orderedBSRs = BoundSheetRecord.orderByBofPosition(boundSheetRecords);}//output.println();//不需要分页//output.println(orderedBSRs[sheetIndex].getSheetname() + " ["//     + (sheetIndex + 1) + "]:");}break;case SSTRecord.sid:sstRecord = (SSTRecord) record;break;case BlankRecord.sid:BlankRecord brec = (BlankRecord) record;thisRow = brec.getRow();thisColumn = brec.getColumn();thisStr = "";break;case BoolErrRecord.sid:BoolErrRecord berec = (BoolErrRecord) record;thisRow = berec.getRow();thisColumn = berec.getColumn();thisStr = "";break;case FormulaRecord.sid:FormulaRecord frec = (FormulaRecord) record;thisRow = frec.getRow();thisColumn = frec.getColumn();if (outputFormulaValues) {if (Double.isNaN(frec.getValue())) {// Formula result is a string// This is stored in the next recordoutputNextStringRecord = true;nextRow = frec.getRow();nextColumn = frec.getColumn();} else {thisStr = formatListener.formatNumberDateCell(frec);}} else {thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook,frec.getParsedExpression()) + '"';}break;case StringRecord.sid:if (outputNextStringRecord) {// String for formulaStringRecord srec = (StringRecord) record;thisStr = srec.getString();thisRow = nextRow;thisColumn = nextColumn;outputNextStringRecord = false;}break;case LabelRecord.sid:LabelRecord lrec = (LabelRecord) record;thisRow = lrec.getRow();thisColumn = lrec.getColumn();thisStr = '"' + lrec.getValue() + '"';break;case LabelSSTRecord.sid:LabelSSTRecord lsrec = (LabelSSTRecord) record;thisRow = lsrec.getRow();thisColumn = lsrec.getColumn();if (sstRecord == null) {thisStr = '"' + "(No SST Record, can't identify string)" + '"';} else {thisStr = '"' + sstRecord.getString(lsrec.getSSTIndex()).toString() + '"';}break;case NoteRecord.sid:NoteRecord nrec = (NoteRecord) record;thisRow = nrec.getRow();thisColumn = nrec.getColumn();// TODO: Find object to match nrec.getShapeId()thisStr = '"' + "(TODO)" + '"';break;case NumberRecord.sid:NumberRecord numrec = (NumberRecord) record;thisRow = numrec.getRow();thisColumn = numrec.getColumn();//if (DateUtil.isInternalDateFormat(numrec.getXFIndex())) {if (numrec.getXFIndex() == 62) {thisStr = dateFormat.format(DateUtil.getJavaDate(numrec.getValue()));}else{thisStr = formatListener.formatNumberDateCell(numrec);}//System.out.println("thisStr:  "+thisStr);break;case RKRecord.sid:RKRecord rkrec = (RKRecord) record;thisRow = rkrec.getRow();thisColumn = rkrec.getColumn();thisStr = '"' + "(TODO)" + '"';break;default:break;}// Handle new rowif (thisRow != -1 && thisRow != lastRowNumber) {lastColumnNumber = -1;}// Handle missing columnif (record instanceof MissingCellDummyRecord) {MissingCellDummyRecord mc = (MissingCellDummyRecord) record;thisRow = mc.getRow();thisColumn = mc.getColumn();thisStr = "";}// If we got something to print out, do soif (thisStr != null) {if (thisColumn > 0) {output.print(',');}output.print(thisStr);}// Update column and row countif (thisRow > -1)lastRowNumber = thisRow;if (thisColumn > -1)lastColumnNumber = thisColumn;// Handle end of rowif (record instanceof LastCellOfRowDummyRecord) {// Print out any missing commas if neededif (minColumns > 0) {// Columns are 0 basedif (lastColumnNumber == -1) {lastColumnNumber = 0;}for (int i = lastColumnNumber; i < (minColumns); i++) {output.print(',');}}// We're onto a new rowlastColumnNumber = -1;// End the rowoutput.println();}}public static void main(String[] args) throws Exception {XLS2CSV xls2csv = new XLS2CSV("D:\\a.xls","D:\\a.csv");xls2csv.process();}
}

.xlsx 转 csv

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;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.ss.usermodel.DateUtil;
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.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;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,}/*** Derived from http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api* <p/>* Also see Standard ECMA-376, 1st edition, part 4, pages 1928ff, at* http://www.ecma-international.org/publications/standards/Ecma-376.htm* <p/>* A web-friendly version is http://openiso.org/Ecma/376/Part4*/class MyXSSFSheetHandler extends DefaultHandler {private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");/*** 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;/*** Accepts objects needed while parsing.** @param styles*            Table of styles* @param strings*            Table of shared strings* @param cols*            Minimum number of columns to show* @param target*            Sink for output*/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();}/** (non-Javadoc)** @see* org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,* java.lang.String, java.lang.String, org.xml.sax.Attributes)*/public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {if ("inlineStr".equals(name) || "v".equals(name)) {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);}}}/** (non-Javadoc)** @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,* java.lang.String, java.lang.String)*/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() + '"';break;case FORMULA:// A formula could result in a string value,// so always add double-quote characters.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() + '"';break;case SSTINDEX:String sstIndex = value.toString();try {int idx = Integer.parseInt(sstIndex);XSSFRichTextString rtss = new XSSFRichTextString(sharedStringsTable.getEntryAt(idx));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)if(this.formatIndex == 31){thisStr = dateFormat.format(DateUtil.getJavaDate(Double.parseDouble(n)));}else{thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex,this.formatString);}elsethisStr = n;//System.out.println("thisStr:  "+thisStr);break;default: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;}}/*** Captures characters only if a suitable element is open. Originally* was just "v"; extended for inlineStr also.*/public void characters(char[] ch, int start, int length)throws SAXException {if (vIsOpen)value.append(ch, start, length);}/*** Converts an Excel column name like "C" to a zero-based index.** @param name* @return Index corresponding to the specified name*/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);}/*** Initiates the processing of the XLS workbook file to CSV.** @throws IOException* @throws OpenXML4JException* @throws ParserConfigurationException* @throws SAXException*/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;}close();}public void close(){this.output.close();}public static void main(String[] args) throws Exception {XLSX2CSV xlsx2csv = new XLSX2CSV("D:\\b.xlsx", "D:\\b.csv");xlsx2csv.process();}}

POI EXCEL(.xls/.xlsx)转CSV格式相关推荐

  1. 将excel(xls/xlsx)转换成csv文件

    将excel(xls/xlsx)转换成csv文件 首先pom.xml 需要引进的包如下: <dependency><groupId>net.sourceforge.jexcel ...

  2. python excel文件转为csv文件_python实现将excel文件转化成CSV格式

    python实现将excel文件转化成CSV格式 如下所示: import pandas as pd data = pd.read_excel('123.xls','Sheet1',index_col ...

  3. 如何批量将 Excel 文档转为 Csv 格式

    概要:CSV 称为逗号分隔值,其文件以纯文本形式存储表格数据(数字和文本),而熟悉 Excel 的小伙伴应该也知道 Excel 也是存储表格数据,只不过 Excel 不仅支持文本,还支持图片.视频等多 ...

  4. 在线TSV转Excel(xls/xlsx)

    在线TSV转Excel(xls/xlsx) 在线TSV转Excel(xls/xlsx) TSV To Excel Converter 可将 TSV 转换为 Excel,在线打开或导入 TSV 文件到 ...

  5. 实现Excel文件的统一读取功能(包含xls、xlsx、csv格式)

    笔者之前使用esayexcel的时候碰到了一个问题,就是easyexcel无法读取csv文件,所以迫不得已之下自己手写了一个统一读取的工具类,在这里分享一下,当然还有许多的不足之处,希望各位看官老爷们 ...

  6. Excel怎么批量将CSV格式转换为xlsx或xls格式?VBA、宏、软件?

    怎么批量将CSV格式转换为xlsx或xls格式? 下面给大家介绍几种方法: 1.原始方法 如果是少量的Excel文件可以采用打开--另存为..,选择想要转换的格式就OK了! 2.利用Excel的VBA ...

  7. Excel拆分多个表格,并保存多个文件,(xlsx或者csv格式)

    > 第一部分 一表拆为多个子表单 以下涉及代码转自https://blog.csdn.net/qq_41554671/article/details/87621830?ops_request_m ...

  8. Java poi Excel xls列号数字转字母

    最近遇到导出的xls中 列是动态生成的,且单元格中需要用到公式,而xls公式不是用数字列号而是用列字母来表示的,这时需要把数字的列号转成该列对应的字母.因为是按月导出 一个月最多31天,所以刚开始采用 ...

  9. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1X9Sl4bWTNHJOJb_v-KUndA  ...

最新文章

  1. 损失函数理解汇总,结合PyTorch1.7和TensorFlow2
  2. php时间下滑出现选择,JQuery设置时间段下拉选择实例_jquery
  3. RxSwift之NotificationCenter的使用和自定义
  4. 移动端H5页面返回并且刷新页面(BFcache)
  5. 【Java】continue和break区别
  6. 联想340c笔记本cpu能升级吗_联想扬天威6 2021款酷睿版怎么样?评测值得买吗?从价格和配置看就知道了...
  7. html页面送值转换,在静态页面html中跳转传值
  8. 快速掌握 10 个 HTML5 必备技巧
  9. Android UI 绘制过程浅析(二)onMeasure过程
  10. 黑岩集团创建者Larry Fink 超长访谈
  11. java ftl 模板 输出list_关于在freemarker模板中遍历数据模型ListJavaBean的经验
  12. 怎么卸载apowerrec_怎么卸载win10自带应用 工具
  13. Windows 10连接打印机提示网路“指定的网络名已不再可用”
  14. 服务器系统https打不开网页,解决网站启动HTTPS出现重定向过多网页打不开问题...
  15. 网卡的HWADDR和MACADDR的区别?
  16. 进去服务器bios设置u盘启动不了系统,重装系统怎么进不了bios设置u盘启动
  17. 第六章第九题(英尺和米之间的转换)(Conversions between feet and meters)
  18. WhatsApp使用教程
  19. DELL T7600工作站重新安装WIN7系统
  20. 【已解决】ocker: Error response from daemon: Conflict. The container name “/nginx“ is alrea.....

热门文章

  1. EasyClick 修改启停按钮
  2. 在Refit上模拟ApiException
  3. php debug 打印变量_打印变量到页面上的方法 PHP debug函数
  4. oracle标点符号的书写规则,法语标点符号及书写规则
  5. 老毛桃WINPE U盘系统安装详解
  6. 顺序表指定位置插入元素
  7. matlab三角多项式拟合,三角多项式拟合方法及地震数据处理
  8. 广义二项式定理的系数的算法
  9. mysql xact abort_数据库事物用法 SET XACT_ABORT ON
  10. 求职面试中这三大传闻你信过吗?