Java____利用HSSF导出、导入excel文件

本文介绍了Java中POI库的HSSF、XSSF和SXSSF的区别,其中HSSF适用于Excel 97-2007,XSSF用于OOXML (.xlsx)文件,而SXSSF是低内存占用的实现,通过滑动窗口限制访问的行数。在使用SXSSF时,会生成临时文件,需要注意清理。文章还给出了HSSF项目的操作实例和Excel数据处理流程。
摘要由CSDN通过智能技术生成


————————————HSSF、XSSF、SXSSF的比较——————————

HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 
XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现 

从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF 

SXSSF通过一个滑动窗口来限制访问Row的数量从而达到低内存占用的目录,XSSF可以访问所有行。旧的行数据不再出现在滑动窗口中并变得无法访问,与此同时写到磁盘上。 
在自动刷新的模式下,可以指定窗口中访问Row的数量,从而在内存中保持一定数量的Row。当达到这一数量时,在窗口中产生新的Row数据,并将低索引的数据从窗口中移动到磁盘中。 
或者,滑动窗口的行数可以设定成自动增长的。它可以根据需要周期的根据一次明确的flushRow(int keepRows)调用来进行修改。 

注意:针对 SXSSF Beta 3.8下,会有临时文件产生,比如: 
poi-sxssf-sheet4654655121378979321.xml 
文件位置:java.io.tmpdir这个环境变量下的位置 
Windows 7下是C:\Users\xxxxxAppData\Local\Temp 
Linux下是 /var/tmp/ 
要根据实际情况,看是否删除这些临时文件 

官方也提供了一些解决方式: 
https://issues.apache.org/bugzilla/show_bug.cgi?id=53493 

与XSSF的对比 
在一个时间点上,只可以访问一定数量的数据 
不再支持Sheet.clone() 
不再支持公式的求值 


—————————————HSSF项目操作实例————————————

——————————ExcelReader预备数据处理文件——————————

从上传的文件中读取数据并返回:

package xxxxx

import java.io.File;
import java.io.FileInputStream;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
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.util.CellRangeAddress;
import org.apache.poi.util.ArrayUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 操作Excel表格的功能类
 */
public class ExcelReader {
    private Sheet sheet;
    private Row row;

    /**
     * 读取Excel表格表头的内容
     * @param InputStream
     * @return String 表头内容的数组
     */
    public String[] readExcelTitle(File file) {
    	String[] title = null;
        try {
        	Workbook wb = null;
        	try{
				wb = new HSSFWorkbook(new FileInputStream(file));
			}catch(OfficeXmlFileException e){
				wb = new XSSFWorkbook(new FileInputStream(file));
			}
        
        sheet = wb.getSheetAt(0);
        row = sheet.getRow(0);
        // 标题总列数
        int colNum = row.getPhysicalNumberOfCells();
        title = new String[colNum];
        for (int i = 0; i < colNum; i++) {
        	Cell cell = row.getCell(i);
            title[i] = cell.getStringCellValue();
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return title;
    }
    /**
     * 读取Excel所有的sheet页名字
     * @param InputStream
     * @return String sheet内容的数组
     */
    public String[] readExcelSheetName(File file) {
    	String[] sheetName = null;
    	try {
    		Workbook wb = null;
    		try{
    			wb = new HSSFWorkbook(new FileInputStream(file));
    		}catch(OfficeXmlFileException e){
    			wb = new XSSFWorkbook(new FileInputStream(file));
    		}
    		int maxSheet=wb.getNumberOfSheets();
    		sheetName=new String[maxSheet];
    		for (int i = 0; i < maxSheet; i++) {
				sheet=wb.getSheetAt(i);
				sheetName[i]=sheet.getSheetName();
			}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return sheetName;
    }
    
    public static void main(String[] args) {
		ExcelReader excle=new ExcelReader();
		//Map<Integer, List<String>> tmp=excle.readExcelContent(new File("c:/test.xls"),74,31);
		Map<Integer, List<String>> tmp=excle.readExcelContent(new File("c:/2007.xlsx"),74,31);
		Object[] obj=tmp.keySet().toArray();
		Arrays.sort(obj);
		for (int i = 1; i < obj.length; i++) {
			System.out.println(tmp.get(obj[i]).toString());
		}
		
	}

    /**
     * 读取Excel数据内容
     * @param InputStream
     * @return Map 包含单元格数据内容的Map对象
     */
    public Map<Integer, List<String>> readExcelContent(File file) {
    	Map<Integer, List<String>> content = new HashMap<Integer, List<String>>();
        try {
        	Workbook wb = null;
        	try{
				wb = new HSSFWorkbook(new FileInputStream(file));
			}catch(OfficeXmlFileException e){
				wb = new XSSFWorkbook(new FileInputStream(file));
			}
	        sheet = wb.getSheetAt(0);
	        // 得到总行数
	        int rowNum = sheet.getLastRowNum()+1;
	        row = sheet.getRow(0);
	        int colNum = row.getPhysicalNu
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值