原文:http://www.cnblogs.com/yangzhilong/p/4052063.html import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.model.SharedStringsTable; 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; import org.xml.sax.helpers.XMLReaderFactory; /** * 基于XSSF and SAX (Event API) * 读取excel的第一个Sheet的内容 * @author yzl * */ public class ReadExcelUtils { private int headCount = 0; private List<List<String>> list = new ArrayList<List<String>>(); private static final Log log = LogFactory.getLog(ReadExcelUtils.class); /** * 通过文件流构建DOM进行解析 * @param ins * @param headRowCount 跳过读取的表头的行数 * @return * @throws InvalidFormatException * @throws IOException */ public List<List<String>> processDOMReadSheet(InputStream ins,int headRowCount) throws InvalidFormatException, IOException { Workbook workbook = WorkbookFactory.create(ins); return this.processDOMRead(workbook, headRowCount); } /** * 采用DOM的形式进行解析 * @param filename * @param headRowCount 跳过读取的表头的行数 * @return * @throws IOException * @throws InvalidFormatException * @throws Exception */ public List<List<String>> processDOMReadSheet(String filename,int headRowCount) throws InvalidFormatException, IOException { Workbook workbook = WorkbookFactory.create(new File(filename)); return this.processDOMRead(workbook, headRowCount); } /** * 采用SAX进行解析 * @param filename * @param headRowCount * @return * @throws OpenXML4JException * @throws IOException * @throws SAXException * @throws Exception */ public List<List<String>> processSAXReadSheet(String filename,int headRowCount) throws IOException, OpenXML4JException, SAXException { headCount = headRowCount; OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader( pkg ); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator<InputStream> sheets = r.getSheetsData(); InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); log.debug("时间:"+DateUtils.getNowTime()+",共读取了execl的记录数为 :"+list.size()); return list; } private XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser" ); ContentHandler handler = new SheetHandler(sst); parser.setContentHandler(handler); return parser; } /** * SAX 解析excel */ private class SheetHandler extends DefaultHandler { private SharedStringsTable sst; private String lastContents; private boolean nextIsString; private boolean isNullCell; //读取行的索引 private int rowIndex = 0; //是否重新开始了一行 private boolean curRow = false; private List<String> rowContent; private SheetHandler(SharedStringsTable sst) { this.sst = sst; } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { //节点的类型 //System.out.println("---------begin:" + name); if(name.equals("row")){ rowIndex++; } //表头的行直接跳过 if(rowIndex > headCount){ curRow = true; // c => cell if(name.equals("c")) { String cellType = attributes.getValue("t"); if(null == cellType){ isNullCell = true; }else{ if(cellType.equals("s")) { nextIsString = true; } else { nextIsString = false; } isNullCell = false; } } // Clear contents cache lastContents = ""; } } public void endElement(String uri, String localName, String name) throws SAXException { //System.out.println("-------end:"+name); if(rowIndex > headCount){ if(nextIsString) { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); nextIsString = false; } if(name.equals("v")) { //System.out.println(lastContents); if(curRow){ //是新行则new一行的对象来保存一行的值 if(null==rowContent){ rowContent = new ArrayList<String>(); } rowContent.add(lastContents); } }else if(name.equals("c") && isNullCell){ if(curRow){ //是新行则new一行的对象来保存一行的值 if(null==rowContent){ rowContent = new ArrayList<String>(); } rowContent.add(null); } } isNullCell = false; if("row".equals(name)){ list.add(rowContent); curRow = false; rowContent = null; } } } public void characters(char[] ch, int start, int length) throws SAXException { lastContents += new String(ch, start, length); } } /** * DOM的形式解析execl * @param workbook * @param headRowCount * @return * @throws InvalidFormatException * @throws IOException */ private List<List<String>> processDOMRead(Workbook workbook,int headRowCount) throws InvalidFormatException, IOException { headCount = headRowCount; Sheet sheet = workbook.getSheetAt(0); //行数 int endRowIndex = sheet.getLastRowNum(); Row row = null; List<String> rowList = null; for(int i=headCount; i<=endRowIndex; i++){ rowList = new ArrayList<String>(); row = sheet.getRow(i); for(int j=0; j<row.getLastCellNum();j++){ if(null==row.getCell(j)){ rowList.add(null); continue; } int dataType = row.getCell(j).getCellType(); if(dataType == Cell.CELL_TYPE_NUMERIC){ DecimalFormat df = new DecimalFormat("0.####################"); rowList.add(df.format(row.getCell(j).getNumericCellValue())); }else if(dataType == Cell.CELL_TYPE_BLANK){ rowList.add(null); }else if(dataType == Cell.CELL_TYPE_ERROR){ rowList.add(null); }else{ //这里的去空格根据自己的情况判断 String valString = row.getCell(j).getStringCellValue(); Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(valString); valString = m.replaceAll(""); //去掉狗日的不知道是啥东西的空格 if(valString.indexOf(" ")!=-1){ valString = valString.substring(0, valString.indexOf(" ")); } rowList.add(valString); } } list.add(rowList); } log.debug("时间:"+DateUtils.getNowTime()+",共读取了execl的记录数为 :"+list.size()); return list; } @SuppressWarnings("unused") public static void main(String[] args) throws Exception { ReadExcelUtils howto = new ReadExcelUtils(); String fileName = "f:/test.xlsx"; List<List<String>> list = howto.processSAXReadSheet(fileName,2); ReadExcelUtils h = new ReadExcelUtils(); String fileName1 = "f:/test.xls"; List<List<String>> result = h.processDOMReadSheet(fileName1,2); } }
导出
public HSSFWorkbook getCaseReport(Map<String,Object> map) throws Exception { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; int sheetNum = 1; HSSFWorkbook book = (HSSFWorkbook)map.get("book"); String createTimeBegin = (String)map.get("createTimeBegin"); String createTimeEnd = (String)map.get("createTimeEnd"); String updateTimeBegin = (String)map.get("updateTimeBegin"); String updateTimeEnd = (String)map.get("updateTimeEnd"); Case cas = (Case)map.get("cas"); if(cas == null) cas = new Case(); cas.setCreateTimeBegin(createTimeBegin); cas.setCreateTimeEnd(createTimeEnd); cas.setUpdateTimeBegin(updateTimeBegin); cas.setUpdateTimeEnd(updateTimeEnd); try { // 产生工作表对象 HSSFSheet sheet = book.createSheet(sheetNum+""); // String sql = utilService.getCodeDesc("sql","case_report"); StringBuffer sql = new StringBuffer("select * from hpcms_case where 1=1"); HSSFCellStyle cellStyle = book.createCellStyle();//设置背景色的代码 cellStyle.setFillBackgroundColor(HSSFColor.YELLOW.index);//再将想要设置背景色的单元格; cellStyle.setFillForegroundColor(HSSFColor.YELLOW.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); boolean first = true; conn = jdbcTemplate.getDataSource().getConnection(); if(cas != null){ if(StringUtils.isNotBlank(cas.getNumberId())){ sql.append(" and (number_Id = '"+cas.getNumberId()+"' or opt_Case_Id = '"+cas.getNumberId()+"')"); } if(StringUtils.isNotBlank(cas.getEmail())){ sql.append(" and email = '" +cas.getEmail() +"'"); } if(StringUtils.isNotBlank(cas.getOwnerName())){ sql.append(" and owner = (select id from hpcms_user where user_name ='"+cas.getOwnerName()+"')"); } if(StringUtils.isNotBlank(cas.getSn())){ sql.append(" and sn like '%"+cas.getSn()+"%'"); } if(StringUtils.isNotBlank(cas.getCreateTimeBegin())){ sql.append(" and to_char(create_date, 'yyyy-mm-dd') >= '"+cas.getCreateTimeBegin()+"'"); } if(StringUtils.isNotBlank(cas.getCreateTimeEnd())){ sql.append(" and to_char(create_date, 'yyyy-mm-dd') <= '"+cas.getCreateTimeEnd()+"'"); } if(StringUtils.isNotBlank(cas.getUpdateTimeBegin())){ sql.append(" and to_char(update_Date, 'yyyy-mm-dd') >= '"+cas.getUpdateTimeBegin()+"' and status = 'Closed'"); } if(StringUtils.isNotBlank(cas.getUpdateTimeEnd())){ sql.append(" and to_char(update_Date, 'yyyy-mm-dd') <= '"+cas.getUpdateTimeEnd()+"' and status = 'Closed'"); } if(StringUtils.isNotBlank(cas.getCreatedName())){ sql.append(" and created = (select id from hpcms_user where user_name ='"+cas.getCreatedName()+"')"); } if(StringUtils.isNotBlank(cas.getStatus())){ sql.append(" and status = '"+cas.getStatus()+"'"); } if(StringUtils.isNotBlank(cas.getPhone1())){ sql.append(" and (phone1 like '%"+cas.getPhone1()+"%' or phone2 like '%"+cas.getPhone1()+"%' or phone3 like '%"+cas.getPhone1()+"%')"); } sql.append("and rownum < 65500"); } log.info("sql > " + sql.toString()); // log.info("beginDate > " + beginDate + " endDate" + endDate); pstmt = conn.prepareStatement(sql.toString()); // pstmt.setString(1, beginDate); // pstmt.setString(2, endDate); rs = pstmt.executeQuery(); int rowNum = 0; while(rs.next()){ if(rowNum%Common.EXCEL03_MAXROW == 0){ sheetNum++; sheet = book.createSheet(sheetNum+""); } HSSFRow row = sheet.createRow(rowNum++);// 创建一行 HSSFRow row2 = null; if(first) row2 = sheet.createRow(rowNum++);// 创建一行 ResultSetMetaData data = rs.getMetaData(); for(int i = 2 ; i<= data.getColumnCount() ; i++){ String columnName = data.getColumnName(i); String columnValue = rs.getString(i); // if("ID".equals(columnName)) // continue; if("OWNER,CREATED,UPDATED".contains(columnName)){ if(StringUtils.isNotBlank(columnValue)){ User u = userMapper.getUserById(columnValue); if(u != null) columnValue = u.getUserName(); } } if("EMAIL".equals(columnName)){ if(StringUtils.isBlank(columnValue)){ columnValue = "N/A"; } } HSSFCell cell = row.createCell(i-2);// 创建一列 cell.setCellType(HSSFCell.CELL_TYPE_STRING); if(first){ cell.setCellValue(columnName); cell.setCellStyle(cellStyle); HSSFCell cell2 = row2.createCell(i-2);// 创建一列 cell2.setCellType(HSSFCell.CELL_TYPE_STRING); cell2.setCellValue(columnValue); }else{ cell.setCellValue(columnValue); } } first = false; }; } catch (Exception e) { e.printStackTrace(); throw e; }finally{ if(rs != null) rs.close(); if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); } return book; }
fOut = response.getOutputStream();
book.write(fOut);
fOut.flush();
book.dispose(); //删除硬盘上生成的临时文件
相关推荐
Poi读取Excel2003+Excel2007 Poi生成Excel2003 源码,调用 方法即可
总之,"spring3.2.5 MVC Poi3.9操作excel批量导入"是一个涵盖了Web开发、数据处理和文件操作的综合技术主题。结合Spring MVC的灵活性、Apache POI的强大文件处理能力以及Maven的项目管理,开发者可以构建出强大且...
"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...
在本例中,我们将聚焦于“poi3.9读写EXCEL”这一主题,特别是针对支持2007版Excel(XLSX格式)的特性。 Apache POI是Apache软件基金会的一个开源项目,其主要目标是提供一个API,使得Java程序员能够处理Microsoft ...
在“poi3.9 操作Excel(支持大数据量) jar包+事例源码”中,我们可以看到一个专门针对大数据处理优化的版本,这使得在Java应用程序中处理大量Excel数据变得高效且实用。 Apache POI 3.9版引入了一些重要的改进和...
在标题中提到的“poi 3.9读取excel xls xlsx 有jar包”,指的是使用Apache POI 3.9版本来读取Excel的工作簿(XLS和XLSX格式)。这个版本的POI包含了处理Excel文件所需的核心组件。 Apache POI 提供了HSSF(Horrible...
利用poi3.9做的excel导出工具。 这是一个工程直接压缩而成的。 测试10万行*8列,从查询到生成文件所花时间13620毫秒 测试100万行*8列,从查询到生成文件所花时间121443毫秒 主要目录: src com.util ----DBUtil.java...
首先,Apache POI 3.9是Apache软件基金会的一个项目,它提供了API来处理Microsoft Office的文件格式,如XLS(Excel 97-2003)和XLSX(Excel 2007及以上)。在这个例子中,我们看到两个主要的任务:生成双色球历史...
以上这些jar包是Apache POI 3.9正常运行所必须的,确保它们在项目的类路径中,才能正确地读取、写入或操作Microsoft Office格式的文件。在使用过程中,根据实际需求,可以选择性地引入必要的jar包,以减少应用程序的...
在Java环境中,Apache POI库是处理Excel数据的首选工具,它提供了丰富的API来读取、写入和操作Excel文件。在这个“poi-3.9”包中,你将获得Apache POI 3.9版本的所有组件,这个版本发布于2012年,虽然相对较旧,但...
在"poi-3.9.jar"这个文件中,包含了Apache POI项目的主要类和接口,用于处理HSSF(Horizontally Stored Formatted Sheets)和XSSF(XML Spreadsheet Format)文件,分别对应老版的.BIFF8 Excel格式和OOXML的新版....
在本文中,我们将深入探讨如何使用Apache POI 3.9版本来读取Excel 2007及更高版本(即XLSX格式)的文件,特别是通过`XSSFWorkbook`类进行操作。首先,你需要确保已经下载了必要的库,这通常包括poi-bin-3.9压缩包,...
"org.apache.poi3.9.jar"是这个项目的一个版本,适用于Java环境,它提供了对Office文档的读取、写入和修改功能。在Java编程中,如果你需要处理Excel数据,这个库是一个非常重要的工具。 该jar包中的主要类和接口...
"poi3.9jar包下载"指的是获取Apache POI 3.9版本的库文件,这个版本的POI支持对Excel的各种操作。 1. **Apache POI基本介绍** Apache POI 是Apache软件基金会的一个项目,它允许Java程序员创建、修改和显示MS ...
标题中的"poi3.9jar包全"指的是Apache POI 3.9版本的完整jar文件,这个版本发布于2013年,是POI的一个稳定版本,包含了处理Office文件所需的所有类和方法。 在Apache POI 3.9中,主要包含以下几个关键组件: 1. **...
在标题“poi3.9+操作docx文件书签_源码_jar包_实例”中提到的,是关于如何利用POI 3.9版本处理.docx文件中的书签,并进行特定的操作,如替换书签内容或利用书签在Word文档的表格中插入新行。 在描述中,重点提及了...
- `poi-ooxml-3.9.jar`: 提供了对Open XML格式(.xlsx, .docx, .pptx)的支持,这是从Excel 2007开始引入的新文件格式。XSSF接口和相关的类就位于这个库中。 - `poi-ooxml-schemas-3.9.jar`: 包含了Open XML格式的...
总之,"POI3.9必要jar包"是Java开发人员处理Excel文件时必不可少的工具集,包含了所有与Apache POI3.9版本相关的库,能够确保项目运行的稳定性和兼容性。使用这些jar文件,开发者可以高效、灵活地进行Excel文件的...
Apache POI 是一个开源项目,专门用于处理微软的...综上,Apache POI 3.9为Java开发者提供了一套强大的工具,使得他们能够在Java环境中无缝地操作和生成Excel文件,无论这些文件是旧的BIFF格式还是现代的OpenXML格式。