已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.前言项目中要求读取excel文件内容,并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。2.代码实例:package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;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.poifs.filesystem.POIFSFileSystem;/* * 操作Excel表格的功能类 */public class ExcelReader private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; /* * 读取Excel表格表头的内容 * param InputStream * return String 表头内容的数组 */ public String readExcelTitle(InputStream is) try fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); catch (IOException e) e.printStackTrace(); sheet = wb.getSheetAt(0); row = sheet.getRow(0); / 标题总列数 int colNum = row.getPhysicalNumberOfCells(); System.out.println(colNum: + colNum); String title = new StringcolNum; for (int i = 0; i colNum; i+) /titlei = getStringCellValue(row.getCell(short) i); titlei = getCellFormatValue(row.getCell(short) i); return title; /* * 读取Excel数据内容 * param InputStream * return Map 包含单元格数据内容的Map对象 */ public Map readExcelContent(InputStream is) Map content = new HashMap(); String str = ; try fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); catch (IOException e) e.printStackTrace(); sheet = wb.getSheetAt(0); / 得到总行数 int rowNum = sheet.getLastRowNum(); row = sheet.getRow(0); int colNum = row.getPhysicalNumberOfCells(); / 正文内容应该从第二行开始,第一行为表头的标题 for (int i = 1; i = rowNum; i+) row = sheet.getRow(i); int j = 0; while (j colNum) / 每个单元格的数据内容用-分割开,以后需要时用String类的replace()方法还原数据 / 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean / str += getStringCellValue(row.getCell(short) j).trim() + / -; str += getCellFormatValue(row.getCell(short) j).trim() + ; j+; content.put(i, str); str = ; return content; /* * 获取单元格数据内容为字符串类型的数据 * * param cell Excel单元格 * return String 单元格数据内容 */ private String getStringCellValue(HSSFCell cell) String strCell = ; switch (cell.getCellType() case HSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cell.getNumericCellValue(); break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ; break; default: strCell = ; break; if (strCell.equals() | strCell = null) return ; if (cell = null) return ; return strCell; /* * 获取单元格数据内容为日期类型的数据 * * param cell * Excel单元格 * return String 单元格数据内容 */ private String getDateCellValue(HSSFCell cell) String result = ; try int cellType = cell.getCellType(); if (cellType = HSSFCell.CELL_TYPE_NUMERIC) Date date = cell.getDateCellValue(); result = (date.getYear() + 1900) + - + (date.getMonth() + 1) + - + date.getDate(); else if (cellType = HSSFCell.CELL_TYPE_STRING) String date = getStringCellValue(cell); result = date.replaceAll(年月, -).replace(日, ).trim(); else if (cellType = HSSFCell.CELL_TYPE_BLANK) result = ; catch (Exception e) System.out.println(日期格式不正确!); e.printStackTrace(); return result; /* * 根据HSSFCell类型设置数据 * param cell * return */ private String getCellFormatValue(HSSFCell cell) String cellvalue = ; if (cell != null) / 判断当前Cell的Type switch (cell.getCellType() / 如果当前Cell的Type为NUMERIC case HSSFCell.CELL_TYPE_NUMERIC: case HSSFCell.CELL_TYPE_FORMULA: / 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell) / 如果是Date类型则,转化为Data格式 /方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00 /cellvalue = cell.getDateCellValue().toLocaleString(); /方法2:这样子的data格式是不带带时分秒的:2011-10-12 Date date = cell.getDateCellValue(); SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd); cellvalue = sdf.format(date); / 如果是纯数字 else / 取得当前Cell的数值 cellvalue = String.valueOf(cell.getNumericCellValue(); break; / 如果当前Cell的Type为STRIN case HSSFCell.CELL_TYPE_STRING: / 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; / 默认的Cell值 default: cellvalue = ; else cellvalue = ; return cellvalue; public static void main(String args) try / 对读取Excel表格标题测试 InputStream is = new FileInputStream(d:test2.xls); ExcelReader excelReader = new ExcelReader(); String title = excelReader.readExcelTitle(is); System.out.println(获得Excel表格的标题:); for (String s : title) System.out.print(s + ); / 对读取Excel表格内容测试 InputStream is2 = new FileInputStream(d:test2.xls); Map map = excelReader.readExcelContent(is2); System.out.println(获得Excel表格的内容:); for (int i = 1; i = map.size(); i+) System.out.println(map.get(i); catch (FileNotFoundException e) System.out.println(未找到指定路径的文件!); e.printStackTrace(); 3.总结因为excel单元格中的内容往往都有一定的格式,比如日期型,数字型,字符串型,因此在读取的时候要进行格式判断,不然会出现错误。常见的就是不能正常读取日期。在代码实例中有一个方法:getCellFormatValue(HSSFCell cell)往这个方法中传入excel单元格就能识别单元格格式,并转化为正确的格式。ps:2012-2-23代码实例中有一段代码:int colNum = row.getPhysicalNumberOfCells();其中的HSSFRow.getPhysicalNumberOfCells();这个方法是用于获取一行中存在的单元格数,POI的官方API中有给出getPhysicalNumberOfCells方法的解释getPhysicalNumberOfCellspublic int getPhysicalNum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GB-T 40421-2021健康信息学 消息与通信 DICOM持久对象的网络访问》专题研究报告
- 2025年中国保险消费者研究报告
- 2024年执业药师(西药)《药理学》考前试题(一)及答案
- 淡水鱼类养殖工安全综合知识考核试卷含答案
- 《GBT 19215.4-2017 电气安装用电缆槽管系统 第 2 部分:特殊要求 第 4 节:辅助端》专题研究报告
- 镁精炼工岗后模拟考核试卷含答案
- 船舶货运员操作竞赛考核试卷含答案
- 电工合金冷变形工岗前内部控制考核试卷含答案
- 印后成型工诚信品质知识考核试卷含答案
- 工业车辆装配调试工安全教育水平考核试卷含答案
- 射血分数保留的心力衰竭诊断与治疗中国专家共识 2025解读
- 全民反恐共创平安课件
- DB51∕T 705-2023 四川主要造林树种苗木质量分级
- 眼睛保健知识111课件
- 国家药监局医疗器械技术审评检查大湾区分中心第二批员额制人员公开招聘(广东)【共500题附答案解析】模拟检测试卷
- ISO9001基础知识培训课件
- 通达信函数大全整理
- 小升初英语衔接存在的问题及其对策优秀获奖科研论文
- 煤矿矿井废水处理设计方案
- 《数字电路逻辑设计》--逻辑函数及其化简练习习题
- 列管式换热器课程设计
评论
0/150
提交评论