自己写的一个读取execl的帮助类

目标:读取execl的第一个sheet,并传入不需要读取的表头的行数,返回该execl里所有数据的list

解析共有2种:1、DOM      2、SAX

  1 import java.io.File;
  2 import java.io.IOException;
  3 import java.io.InputStream;
  4 import java.text.DecimalFormat;
  5 import java.util.ArrayList;
  6 import java.util.Iterator;
  7 import java.util.List;
  8 import java.util.regex.Matcher;
  9 import java.util.regex.Pattern;
 10
 11 import org.apache.commons.logging.Log;
 12 import org.apache.commons.logging.LogFactory;
 13 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 14 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
 15 import org.apache.poi.openxml4j.opc.OPCPackage;
 16 import org.apache.poi.ss.usermodel.Cell;
 17 import org.apache.poi.ss.usermodel.Row;
 18 import org.apache.poi.ss.usermodel.Sheet;
 19 import org.apache.poi.ss.usermodel.Workbook;
 20 import org.apache.poi.ss.usermodel.WorkbookFactory;
 21 import org.apache.poi.xssf.eventusermodel.XSSFReader;
 22 import org.apache.poi.xssf.model.SharedStringsTable;
 23 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
 24 import org.xml.sax.Attributes;
 25 import org.xml.sax.ContentHandler;
 26 import org.xml.sax.InputSource;
 27 import org.xml.sax.SAXException;
 28 import org.xml.sax.XMLReader;
 29 import org.xml.sax.helpers.DefaultHandler;
 30 import org.xml.sax.helpers.XMLReaderFactory;
 31
 32 /**
 33  * 基于XSSF and SAX (Event API)
 34  * 读取excel的第一个Sheet的内容
 35  * @author yzl
 36  *
 37  */
 38 public class ReadExcelUtils {
 39     private int headCount = 0;
 40     private List<List<String>> list = new ArrayList<List<String>>();
 41     private static final Log log = LogFactory.getLog(ReadExcelUtils.class);
 42
 43     /**
 44      * 通过文件流构建DOM进行解析
 45      * @param ins
 46      * @param headRowCount
 47      * @return
 48      * @throws InvalidFormatException
 49      * @throws IOException
 50      */
 51     public  List<List<String>> processDOMReadSheet(InputStream ins,int headRowCount) throws InvalidFormatException, IOException {
 52         Workbook workbook = WorkbookFactory.create(ins);
 53         return this.processDOMRead(workbook, headCount);
 54     }
 55
 56     /**
 57      * 采用DOM的形式进行解析
 58      * @param filename
 59      * @param headRowCount
 60      * @return
 61      * @throws IOException
 62      * @throws InvalidFormatException
 63      * @throws Exception
 64      */
 65     public  List<List<String>> processDOMReadSheet(String filename,int headRowCount) throws InvalidFormatException, IOException {
 66         Workbook workbook = WorkbookFactory.create(new File(filename));
 67         return this.processDOMRead(workbook, headCount);
 68     }
 69
 70     /**
 71      * 采用SAX进行解析
 72      * @param filename
 73      * @param headRowCount
 74      * @return
 75      * @throws OpenXML4JException
 76      * @throws IOException
 77      * @throws SAXException
 78      * @throws Exception
 79      */
 80     public List<List<String>> processSAXReadSheet(String filename,int headRowCount) throws IOException, OpenXML4JException, SAXException   {
 81         headCount = headRowCount;
 82
 83         OPCPackage pkg = OPCPackage.open(filename);
 84         XSSFReader r = new XSSFReader( pkg );
 85         SharedStringsTable sst = r.getSharedStringsTable();
 86         XMLReader parser = fetchSheetParser(sst);
 87
 88         Iterator<InputStream> sheets = r.getSheetsData();
 89         InputStream sheet = sheets.next();
 90         InputSource sheetSource = new InputSource(sheet);
 91         parser.parse(sheetSource);
 92         sheet.close();
 93
 94         log.debug("时间:"+DateUtils.getNowTime()+",共读取了execl的记录数为 :"+list.size());
 95
 96         return list;
 97     }
 98
 99     private XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
100         XMLReader parser =
101             XMLReaderFactory.createXMLReader(
102                     "org.apache.xerces.parsers.SAXParser"
103             );
104         ContentHandler handler = new SheetHandler(sst);
105         parser.setContentHandler(handler);
106         return parser;
107     }
108
109     /**
110      * SAX 解析excel
111      */
112     private class SheetHandler extends DefaultHandler {
113         private SharedStringsTable sst;
114         private String lastContents;
115         private boolean nextIsString;
116         private boolean isNullCell;
117         //读取行的索引
118         private int rowIndex = 0;
119         //是否重新开始了一行
120         private boolean curRow = false;
121         private List<String> rowContent;
122
123         private SheetHandler(SharedStringsTable sst) {
124             this.sst = sst;
125         }
126
127         public void startElement(String uri, String localName, String name,
128                 Attributes attributes) throws SAXException {
129             //节点的类型
130             //System.out.println("---------begin:" + name);
131             if(name.equals("row")){
132                 rowIndex++;
133             }
134             //表头的行直接跳过
135             if(rowIndex > headCount){
136                 curRow = true;
137                 // c => cell
138                 if(name.equals("c")) {
139                     String cellType = attributes.getValue("t");
140                     if(null == cellType){
141                         isNullCell = true;
142                     }else{
143                         if(cellType.equals("s")) {
144                             nextIsString = true;
145                         } else {
146                             nextIsString = false;
147                         }
148                         isNullCell = false;
149                     }
150                 }
151                 // Clear contents cache
152                 lastContents = "";
153             }
154         }
155
156         public void endElement(String uri, String localName, String name)
157                 throws SAXException {
158             //System.out.println("-------end:"+name);
159             if(rowIndex > headCount){
160                 if(nextIsString) {
161                     int idx = Integer.parseInt(lastContents);
162                     lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
163                     nextIsString = false;
164                 }
165                 if(name.equals("v")) {
166                     //System.out.println(lastContents);
167                     if(curRow){
168                         //是新行则new一行的对象来保存一行的值
169                         if(null==rowContent){
170                             rowContent = new ArrayList<String>();
171                         }
172                         rowContent.add(lastContents);
173                     }
174                 }else if(name.equals("c") && isNullCell){
175                     if(curRow){
176                         //是新行则new一行的对象来保存一行的值
177                         if(null==rowContent){
178                             rowContent = new ArrayList<String>();
179                         }
180                         rowContent.add(null);
181                     }
182                 }
183
184                 isNullCell = false;
185
186                 if("row".equals(name)){
187                     list.add(rowContent);
188                     curRow = false;
189                     rowContent = null;
190                 }
191             }
192
193         }
194
195         public void characters(char[] ch, int start, int length)
196                 throws SAXException {
197             lastContents += new String(ch, start, length);
198         }
199     }
200
201     /**
202      * DOM的形式解析execl
203      * @param workbook
204      * @param headRowCount
205      * @return
206      * @throws InvalidFormatException
207      * @throws IOException
208      */
209     private List<List<String>> processDOMRead(Workbook workbook,int headRowCount) throws InvalidFormatException, IOException {
210         headCount = headRowCount;
211
212         Sheet sheet = workbook.getSheetAt(0);
213         //行数
214         int endRowIndex = sheet.getLastRowNum();
215
216         Row row = null;
217         List<String> rowList = null;
218
219         for(int i=headCount; i<=endRowIndex; i++){
220             rowList = new ArrayList<String>();
221             row = sheet.getRow(i);
222             for(int j=0; j<row.getLastCellNum();j++){
223                 if(null==row.getCell(j)){
224                     rowList.add(null);
225                     continue;
226                 }
227                 int dataType = row.getCell(j).getCellType();
228                 if(dataType == Cell.CELL_TYPE_NUMERIC){
229                     DecimalFormat df = new DecimalFormat("0.####################");
230                     rowList.add(df.format(row.getCell(j).getNumericCellValue()));
231                 }else if(dataType == Cell.CELL_TYPE_BLANK){
232                     rowList.add(null);
233                 }else if(dataType == Cell.CELL_TYPE_ERROR){
234                     rowList.add(null);
235                 }else{
236                     //这里的去空格根据自己的情况判断
237                     String valString = row.getCell(j).getStringCellValue();
238                     Pattern p = Pattern.compile("\\s*|\t|\r|\n");
239                     Matcher m = p.matcher(valString);
240                     valString = m.replaceAll("");
241                     //去掉狗日的不知道是啥东西的空格
242                     if(valString.indexOf(" ")!=-1){
243                         valString = valString.substring(0, valString.indexOf(" "));
244                     }
245
246                     rowList.add(valString);
247                 }
248             }
249
250             list.add(rowList);
251         }
252         log.debug("时间:"+DateUtils.getNowTime()+",共读取了execl的记录数为 :"+list.size());
253
254         return list;
255     }
256
257     @SuppressWarnings("unused")
258     public static void main(String[] args) throws Exception {
259         ReadExcelUtils howto = new ReadExcelUtils();
260         String fileName = "f:/test.xlsx";
261         List<List<String>> list = howto.processSAXReadSheet(fileName,2);
262
263         ReadExcelUtils h = new ReadExcelUtils();
264         String fileName1 = "f:/test.xls";
265         List<List<String>> result = h.processDOMReadSheet(fileName1,2);
266     }
267 }
时间: 2024-10-12 08:49:18

自己写的一个读取execl的帮助类的相关文章

写了一个DELPHI操作USB摄像头类分享给大家

最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } { 操作USB摄像头类 } { } { 作者:lqen } { 日期:2015.05.18 } { } {*******************************************************} unit untUsbCamera; interface uses Window

使用Apache POI写的一个生成Excel的工具类

话不多说,直接上代码,就一个类,注释也写得比较清楚了. /** * */ package com.common.office; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.util.Calendar; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apach

写一个读取hfile的mapreduce之获取HFile内容

之前介绍了关于Mapreduce是进行输入处理的.这一篇将会介绍如何从Hfile中获取内容.这里和一般获取hbase的数据过程不太一样,不会去创建HTable对象而是直接去读取HFile文件.闲话不多说,直接上代码.先写一个单进程读取HFile的程序 1 public class HFileReaderUtil { 2 3 private Configuration conf ; 4 5 private Path path ; 6 7 private HFile.Reader reader; 8

我写的一个ExcelHelper通用类,可用于读取或生成数据

读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三方组件(比如:NPOI),优点:无需安装OFFICE软件,缺点:需要引入第三方组件,当然这个还是比较强的 3.通过把EXCEL当成数据库,连接后运用SQL语句读取,写入的话就自行拼接成HTML表格,优点:无需另外的组件,缺点:需要会SQL及拼接HTML表格较麻烦: 三种方法我都有用过,若开发BS网站

读取Execl表 导入数据库

不知不觉博客园园林都两年多了,我是今年毕业的应届生,最近公司项目需要改动,很多的数据需要导入,很多的实体类需要些.考虑到这些问题自己写了两个winform版的小工具,一个是读取Execl数据导入数据库,另一个是自动生成实体类,以及增,删,改的方法.今天先分享Execl数据导入数据库.基本上没什么界面就两个按钮而已.一个是选择导入的文件,一个是导入数据库按钮. 首先我写了一个MSSQLAction的类,取数据的类,相当于三层里面的SqlHelper类,里面有两个方法 一个是准备读取数据前的命令配置

C# 读取Execl和Access数据库

第一次写,请大家指教!!话不多说 直接走代码! 1 /// <summary> 2 /// 打开文件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void btn_file_Click(object sender, EventArgs e) 7 { 8

以前写的一个下载小说的工具

因为当时发现只有一个站点有.但是时时联网的要求太让人不爽.就写了一个给全下下来了. 用到了: 1. 正则表达式,分析章节和内容: 2. 线程池下载,并且对下载中的相关超时做了一些处理: 3. 文件生成与写入,注意格式问题: 结合下载来说一下使用中的感受: 1. 下载并没有想像的飞一般的速度: 2. 经常会出现错误,章节读取不到,(估计是服务器无法响应): 3. 终于不用一直联网了. *__*

自己写的一个帧处理代码,请多多指教

这段时间在一个项目中负责程序与下位机USB设备的通讯.将接收到的USB数据做帧处理之后做成一个完整的帧送入队列中等待上层应用对帧数据进行解析. 相信很多人在做与下位机通讯的项目的时候,都会为帧处理烦恼.因为上位机在接收数据的时候,由于收到操作系统调度的影响,有时候收到的是半帧,有时候收到的是一帧半数据.如果不做帧处理的话,就会严重丢包. 在项目中我写了一个帧处理代码,经过测试验证很稳定.拿出来分享一下,也请大家多多指教. 我们项目中的协议是<<.................>>

51单片机实现对24C02进行页写、顺序读取并显示验证

源:51单片机实现对24C02进行页写.顺序读取并显示验证 //************************************************************************************* //**程序名称:51单片机实现对24C02进行页写.顺序读取并显示验证 //**编写人:**** //**修改人:**** //**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信 //**功能描述:51单片机将8个字节数据写入24C02的一