`
derek_z
  • 浏览: 16971 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

poi3.9 操作excel 2007

阅读更多
原文: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 3.9操作Excel2007、Excel2003

    Poi读取Excel2003+Excel2007 Poi生成Excel2003 源码,调用 方法即可

    spring3.2.5 MVC Poi3.9操作excel批量导入

    总之,"spring3.2.5 MVC Poi3.9操作excel批量导入"是一个涵盖了Web开发、数据处理和文件操作的综合技术主题。结合Spring MVC的灵活性、Apache POI的强大文件处理能力以及Maven的项目管理,开发者可以构建出强大且...

    poi3.9读写excel兼容03和07版本

    "poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...

    poi3.9读写EXCEL

    在本例中,我们将聚焦于“poi3.9读写EXCEL”这一主题,特别是针对支持2007版Excel(XLSX格式)的特性。 Apache POI是Apache软件基金会的一个开源项目,其主要目标是提供一个API,使得Java程序员能够处理Microsoft ...

    poi3.9 操作Excel(支持大数据量) jar包+事例源码

    在“poi3.9 操作Excel(支持大数据量) jar包+事例源码”中,我们可以看到一个专门针对大数据处理优化的版本,这使得在Java应用程序中处理大量Excel数据变得高效且实用。 Apache POI 3.9版引入了一些重要的改进和...

    poi 3.9读取excel xls xlsx 有jar包

    在标题中提到的“poi 3.9读取excel xls xlsx 有jar包”,指的是使用Apache POI 3.9版本来读取Excel的工作簿(XLS和XLSX格式)。这个版本的POI包含了处理Excel文件所需的核心组件。 Apache POI 提供了HSSF(Horrible...

    利用poi3.9做的excel导出工具

    利用poi3.9做的excel导出工具。 这是一个工程直接压缩而成的。 测试10万行*8列,从查询到生成文件所花时间13620毫秒 测试100万行*8列,从查询到生成文件所花时间121443毫秒 主要目录: src com.util ----DBUtil.java...

    利用poi3.9操作excel例子,对比双色球的历史中奖数据

    首先,Apache POI 3.9是Apache软件基金会的一个项目,它提供了API来处理Microsoft Office的文件格式,如XLS(Excel 97-2003)和XLSX(Excel 2007及以上)。在这个例子中,我们看到两个主要的任务:生成双色球历史...

    poi3.9 依赖的jar包

    以上这些jar包是Apache POI 3.9正常运行所必须的,确保它们在项目的类路径中,才能正确地读取、写入或操作Microsoft Office格式的文件。在使用过程中,根据实际需求,可以选择性地引入必要的jar包,以减少应用程序的...

    poi-3.9 使用poi技术处理Excel表导入、导出的包

    在Java环境中,Apache POI库是处理Excel数据的首选工具,它提供了丰富的API来读取、写入和操作Excel文件。在这个“poi-3.9”包中,你将获得Apache POI 3.9版本的所有组件,这个版本发布于2012年,虽然相对较旧,但...

    poi-3.9 apache-poi-3.9 最新稳定版本

    在"poi-3.9.jar"这个文件中,包含了Apache POI项目的主要类和接口,用于处理HSSF(Horizontally Stored Formatted Sheets)和XSSF(XML Spreadsheet Format)文件,分别对应老版的.BIFF8 Excel格式和OOXML的新版....

    poi-bin-3.9以及读取Excel2007/2010文件的XSSFWorkbook方法所需的架包

    在本文中,我们将深入探讨如何使用Apache POI 3.9版本来读取Excel 2007及更高版本(即XLSX格式)的文件,特别是通过`XSSFWorkbook`类进行操作。首先,你需要确保已经下载了必要的库,这通常包括poi-bin-3.9压缩包,...

    org.apache.poi3.9 jar包

    "org.apache.poi3.9.jar"是这个项目的一个版本,适用于Java环境,它提供了对Office文档的读取、写入和修改功能。在Java编程中,如果你需要处理Excel数据,这个库是一个非常重要的工具。 该jar包中的主要类和接口...

    poi3.9jar包下载

    "poi3.9jar包下载"指的是获取Apache POI 3.9版本的库文件,这个版本的POI支持对Excel的各种操作。 1. **Apache POI基本介绍** Apache POI 是Apache软件基金会的一个项目,它允许Java程序员创建、修改和显示MS ...

    poi3.9jar包全

    标题中的"poi3.9jar包全"指的是Apache POI 3.9版本的完整jar文件,这个版本发布于2013年,是POI的一个稳定版本,包含了处理Office文件所需的所有类和方法。 在Apache POI 3.9中,主要包含以下几个关键组件: 1. **...

    poi3.9+操作docx文件书签_源码_jar包_实例

    在标题“poi3.9+操作docx文件书签_源码_jar包_实例”中提到的,是关于如何利用POI 3.9版本处理.docx文件中的书签,并进行特定的操作,如替换书签内容或利用书签在Word文档的表格中插入新行。 在描述中,重点提及了...

    POI3.9涉及jar包汇总

    - `poi-ooxml-3.9.jar`: 提供了对Open XML格式(.xlsx, .docx, .pptx)的支持,这是从Excel 2007开始引入的新文件格式。XSSF接口和相关的类就位于这个库中。 - `poi-ooxml-schemas-3.9.jar`: 包含了Open XML格式的...

    POI3.9必要jar包

    总之,"POI3.9必要jar包"是Java开发人员处理Excel文件时必不可少的工具集,包含了所有与Apache POI3.9版本相关的库,能够确保项目运行的稳定性和兼容性。使用这些jar文件,开发者可以高效、灵活地进行Excel文件的...

    Poi 3.9 Jar包

    Apache POI 是一个开源项目,专门用于处理微软的...综上,Apache POI 3.9为Java开发者提供了一套强大的工具,使得他们能够在Java环境中无缝地操作和生成Excel文件,无论这些文件是旧的BIFF格式还是现代的OpenXML格式。

Global site tag (gtag.js) - Google Analytics