开发者社区> 问答> 正文

写了一个简单的excel读取类,待扩展更新:报错

工作上的需要,要导入excel到数据库,故简单写了个excel的读取类,功能非常简陋,望各位大虾多多指教,多多补充。后续会应需要增加读取方法。工作结束后更新写操作。

代码上功能上有不对的或别扭的,望各位大虾指正。

package cn.xulu.webdemo.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.AreaReference;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellReference;
/**
 * Excel操作工具类
 * @author xulu
 */ public class ExcelUtil { HSSFWorkbook wb; /** * 构造函数 * @param filePath 文件路径 */ public ExcelUtil(String filePath) { POIFSFileSystem ps; try { ps = new POIFSFileSystem(new FileInputStream(filePath)); wb = new HSSFWorkbook(ps); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 构造函数 * @param wb 工作表 */ public ExcelUtil(HSSFWorkbook wb) { this.wb = wb; } /** * 根据单元格位置、所属表、单元格内容格式获取单元格内容 * @param cellName 单元格位置 * @param sheet 表名 * @return */ public Object getCellValue(String cellName, HSSFSheet sheet, String valueType) { Object value = null; AreaReference af = new AreaReference(cellName); CellReference[] crfs = af.getAllReferencedCells(); for (int i = 0; i < crfs.length; i++) { // System.out.print(crfs[i]); Row r = sheet.getRow(crfs[i].getRow()); Cell c = r.getCell(crfs[i].getCol()); // System.out.print(c.getCellFormula() + " "); if (valueType.equals("C") || valueType.equals("V")) { value = c.getStringCellValue(); } else if (valueType.equals("N")) { value = c.getNumericCellValue(); } else { value = this.getValue(c); } } return value; } /** * 获取单元格内容,进行内容类型判断 * @param c * @return */ public Object getValue(Cell c) { Object value = null; switch (c.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: value = c.getBooleanCellValue(); break; case Cell.CELL_TYPE_NUMERIC: //先看是否是日期格式 if (DateUtil.isCellDateFormatted(c)) { //读取日期格式 value = c.getDateCellValue(); } else { //读取数字 value = c.getNumericCellValue(); } break; case Cell.CELL_TYPE_STRING: //读取String value = c.getRichStringCellValue().toString(); break; } return value; } /** * 获取指定sheet、行号的内容 * @param sheet 表格 * @param rowIndex 行号 * @return 内容集合 */ public Collection getRowValue(HSSFSheet sheet, int rowIndex) { int countCell = 0; Object value = null; Collection values = new ArrayList(); HSSFRow row = sheet.getRow(rowIndex); countCell = row.getPhysicalNumberOfCells(); for (int i = 0; i < countCell; i++) { value = this.getValue(row.getCell(i)); values.add(value); } return values; } /** * 主函数,测试用 * @param args */ public static void main(String[] args) { ExcelUtil eu = new ExcelUtil("D://公司年度偿付能力报表表样(2010年版+再.xls"); HSSFSheet sheet = eu.wb.getSheet("SCX-4"); // Object value = eu.getCellValue("A2", sheet, "V"); //System.out.println("value = " + value); Collection values = eu.getRowValue(sheet, 3); System.out.println(values.toString()); } }

 

展开
收起
kun坤 2020-06-07 20:00:55 661 0
1 条回答
写回答
取消 提交回答
  • poi?  jxl也不错,可以穿插着用, fastexcel工业级强度适应, 前两者占内存大,后者一般用于大批量的数据“导入”

    2020-06-07 20:01:01
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
HBase2.0重新定义小对象实时存取 立即下载
大批量处理excel文件到ODPS中方案 立即下载
4个迭代,从批量交...1573957773.pdf 立即下载