Java读取MicrosoftOffice Excel的内容
2016-05-30 17:32
344 查看
Java读取MicrosoftOffice Word的内容
用到的jar包:
下载地址:
http://download.csdn.net/detail/capmiachael/9535646
- 例1:
注意:
sheet.getLastRowNum()和getLastCellNum();
返回值经常与我们预期的不一致。
原因:
当单元格设置了格式后,填入值,又删除,但此时有些格式信息没有跟着删除,这时getLastRowNum返回的值就会大于我们预期的值。
只有单元格没设置格式时才能正确获取值,因此就需要我们去利用单元格内容判断,如:某一列或几列是否有数据。较为麻烦,但也是可行的。
例2:
用到的jar包:
poi-3.9.jar, stax2-api.jar, xmlbeans-2.3.0.jar,: poi-ooxml-3.9.jar, poi-ooxml-schemas-3.9-20121203.jar, dom4j-1.6.1.jar,
下载地址:
http://download.csdn.net/detail/capmiachael/9535646
- 例1:
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 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.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.springframework.web.multipart.MultipartFile; public class MicroOfficeFile { public Workbook readExcel(File file) { Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。 try { // InputStream ins = file.; wb = WorkbookFactory.create(file); } catch (IOException e) { System.out.println("获取文档数据流出错。"); e.printStackTrace(); } catch (InvalidFormatException e) { System.out.println("创建Excel文件出错。"); e.printStackTrace(); } catch (IllegalArgumentException e) { System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream"); System.out.println("这不是一个Excel文件"); } return wb; } public Workbook readExcel(MultipartFile multipartFile) { // multipartFile.getName(); //得到的是<input type="file">的name属性值。 // System.out.println(multipartFile.getOriginalFilename() +" uploaded! "); //获取文件名 Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。 try { InputStream ins = multipartFile.getInputStream(); wb = WorkbookFactory.create(ins); } catch (IOException e) { System.out.println("获取文档数据流出错。"); e.printStackTrace(); } catch (InvalidFormatException e) { System.out.println("创建Excel文件出错。"); e.printStackTrace(); } catch (IllegalArgumentException e) { System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream"); System.out.println("这不是一个Excel文件"); } return wb; } /** * 取Excel所有数据,包含header * @return List<String[]> */ public List<String[]> getAllData(Workbook wb, int sheetIndex) { List<String[]> dataList = new ArrayList<String[]>(); int columnNum = 0; Sheet sheet = wb.getSheetAt(sheetIndex); if (sheet.getRow(0) != null) { columnNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum(); } if (columnNum > 0) { for (Row row : sheet) { String[] singleRow = new String[columnNum]; int n = 0; for (int i = 0; i < columnNum; i++) { Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK); switch (cell.getCellType()) { case Cell.CELL_TYPE_BLANK: singleRow = ""; break; case Cell.CELL_TYPE_BOOLEAN: singleRow = Boolean.toString( cell.getBooleanCellValue() ); break; // 数值 case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { //判断是否是日期 Date date = cell.getDateCellValue(); singleRow = DateTransform.Date2String(date, "yyyy-MM-dd HH:mm:ss"); } else { cell.setCellType(Cell.CELL_TYPE_STRING); String temp = cell.getStringCellValue(); // 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串 if (temp.indexOf(".") > -1) { singleRow = String.valueOf( new Double(temp) ).trim(); } else { singleRow = temp.trim(); } } break; case Cell.CELL_TYPE_STRING: singleRow = cell.getStringCellValue().trim(); break; case Cell.CELL_TYPE_ERROR: singleRow = ""; break; case Cell.CELL_TYPE_FORMULA: cell.setCellType(Cell.CELL_TYPE_STRING); singleRow = cell.getStringCellValue(); if (singleRow != null) { singleRow = singleRow .replaceAll("#N/A", "").trim(); } break; default: singleRow = ""; break; } n++; } if ("".equals(singleRow[0])) { continue; }// 如果第一行为空,跳过 dataList.add(singleRow); } } return dataList; } } public static void main(String [] args){ MicroOfficeFile mof = new MicroOfficeFile(); String filepath = "E:\\001.xls"; Workbook wb = mof.readExcel(filepath); List<String[]> list = mof.getAllData(wb, 0); return list;//不需要的不分可用sublist()截取,例如:return list.sublist(1, list.size()-3),第一行 //以及最后三行不要 } }
注意:
sheet.getLastRowNum()和getLastCellNum();
返回值经常与我们预期的不一致。
原因:
当单元格设置了格式后,填入值,又删除,但此时有些格式信息没有跟着删除,这时getLastRowNum返回的值就会大于我们预期的值。
只有单元格没设置格式时才能正确获取值,因此就需要我们去利用单元格内容判断,如:某一列或几列是否有数据。较为麻烦,但也是可行的。
例2:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFWorkbook; 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.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * 读取Excel * * @author Michael */ public class ReadBusExcelUtils { // private Logger logger = LoggerFactory.getLogger(ReadBusExcelUtils.class); private Workbook wb; private Sheet sheet; private Row row; public ReadBusExcelUtils(String filepath) { if (filepath == null) { return; } String ext = filepath.substring(filepath.lastIndexOf(".")); try { InputStream is = new FileInputStream(filepath); if (".xls".equals(ext)) { wb = new HSSFWorkbook(is); } else if (".xlsx".equals(ext)) { wb = new XSSFWorkbook(is); } else { wb = null; } } catch (FileNotFoundException e) { e.printStackTrace(); // logger.error("FileNotFoundException", e); } catch (IOException e) { e.printStackTrace(); // logger.error("IOException", e); } } /** * 读取Excel数据内容 * * @param InputStream * @return Map 包含单元格数据内容的Map对象 * @author Michael */ public ArrayList<ArrayList<Object>> readExcelContent() throws Exception { if (wb == null) { throw new Exception("Workbook对象为空!"); } ArrayList<ArrayList<Object>> content = new ArrayList<ArrayList<Object>>(); int sheetsNum = wb.getNumberOfSheets(); // 获取Sheet的个数 for (int index = 0; index < sheetsNum; index++) { sheet = wb.getSheetAt(index); // 得到当前sheet总行数 int rowNum = sheet.getLastRowNum(); row = sheet.getRow(0); int colNum = row.getPhysicalNumberOfCells(); for (int i = 5; i <= rowNum; i++) { row = sheet.getRow(i); int j = 0; ArrayList<Object> cellValue = new ArrayList<Object>(); while (j < colNum) { Object obj = null; switch (j) {// 对第10,11,12列的数据进行取整操作 case 10: case 11: case 12: obj = getCellFormatValue(row.getCell(j), 0); break; default: obj = getCellFormatValue(row.getCell(j), 4);// 其他情况数字保留四位小数 } cellValue.add(obj); // System.out.println(j+"----"+cellValue); j++; } if (cellValue.get(1) != "") content.add(cellValue); } sheet = null; } return content; } /** * 根据Cell类型设置数据,如果是数字,小数点后保留DotNum位 * * @param cell * @param DotNum * :需要保留的小数位数,若为0,取整。 * @return */ private Object getCellFormatValue(Cell cell, int DotNum) { Object cellvalue = ""; if (cell != null) { // 判断当前Cell的Type switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC:// 如果当前Cell的Type为NUMERIC case Cell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 对日期进行格式化 cellvalue = df.format(date); } else {// 如果是纯数字 String Datatype = "#####0"; switch (DotNum) { case 1: Datatype = "#####0.#"; break; case 2: Datatype = "#####0.##"; break; case 3: Datatype = "#####0.###"; break; case 4: Datatype = "#####0.####"; break; case 5: Datatype = "#####0.#####"; break; case 6: Datatype = "#####0.######"; break; default: break; } DecimalFormat df = new DecimalFormat(Datatype);// 浮点数格式化对象---整数保留原样,小数最多保留到第四位 cellvalue = String.valueOf(df.format( cell.getNumericCellValue()).toString()); } break; } case Cell.CELL_TYPE_STRING:// 如果当前Cell的Type为STRING cellvalue = cell.getRichStringCellValue().getString().trim();// 取得当前的Cell字符串,删去字符串首尾的空格 break; case Cell.CELL_TYPE_BOOLEAN:// 如果当前是Boolean型 cellvalue = Boolean.toString(cell.getBooleanCellValue()); break; default:// 默认的Cell值 cellvalue = ""; } } else { cellvalue = ""; } return cellvalue; } public static void main(String[] args) { try { String filepath = "E:\\001.xls"; ReadBusExcelUtils excelReader = new ReadBusExcelUtils(filepath); /** * 打印Excel表格内容 */ ArrayList<ArrayList<Object>> array = excelReader.readExcelContent(); System.out.println("--------------------Excel表格的内容:--------------------"); System.out.println("表格行数:"+array.size()); System.out.println(); System.out.println(); for (int i = 0; i < array.size(); i++) { System.out.println(array.get(i)); } } catch (FileNotFoundException e) { System.out.println("未找到指定路径的文件,请检查路径或文件名!"); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
相关文章推荐
- MyEclipse 2016 CI 3发布
- java 成员访问级别
- JAVA集合
- RxJava(六) retryWhen操作符实现错误重试机制
- RxJava retryWhen操作符实现错误重试机制
- jdk1.8 和spring 2.5.5 兼容性问题
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- SpringMVC学习系列(4) 之 数据绑定-1
- java接口可以多继承
- Myeclipse常用设置
- Java的一些知识图片
- Java Annotation 必须掌握的特性
- DB Version Control Tool "Flyway" note 2 Auto run.
- Java之IO操作总结
- ThreadLocal防止并发线程安全 线程隔离-ThreadLocalMap
- spring+mybatis
- struts2文件上传
- 首页 > 精品文库 > java.io.FileNotFoundException:文件名、目录名或卷标语法不正确 java.io.FileNotFoundException:文件名、目录名或卷标语
- LRU缓存实现(Java)
- 在Eclipse中安装Subclipse