- /**
- * 處理excel讀入的工具類
- * Created by Liujishuai on 2015/8/5.
- */
- public class ExcelUtils {
- /**
- * 要求excel版本在2007以上
- *
- * @param file 文件信息
- * @return
- * @throws Exception
- */
- public static List<List<Object>> readExcel(File file) throws Exception {
- if(!file.exists()){
- throw new Exception("找不到文件");
- }
- List<List<Object>> list = new LinkedList<List<Object>>();
- XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
- // 讀取第一張表格內容
- XSSFSheet sheet = xwb.getSheetAt(0);
- XSSFRow row = null;
- XSSFCell cell = null;
- for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {
- row = sheet.getRow(i);
- if (row == null) {
- continue;
- }
- List<Object> linked = new LinkedList<Object>();
- for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
- Object value = null;
- cell = row.getCell(j);
- if (cell == null) {
- continue;
- }
- switch (cell.getCellType()) {
- case XSSFCell.CELL_TYPE_STRING:
- //String類型返回String數據
- value = cell.getStringCellValue();
- break;
- case XSSFCell.CELL_TYPE_NUMERIC:
- //日期數據返回LONG類型的時間戳
- if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {
- //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
- value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;
- } else {
- //數值類型返回double類型的數字
- //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
- value = cell.getNumericCellValue();
- }
- break;
- case XSSFCell.CELL_TYPE_BOOLEAN:
- //布爾類型
- value = cell.getBooleanCellValue();
- break;
- case XSSFCell.CELL_TYPE_BLANK:
- //空單元格
- break;
- default:
- value = cell.toString();
- }
- if (value != null && !value.equals("")) {
- //單元格不爲空,則加入列表
- linked.add(value);
- }
- }
- if (linked.size()!= 0) {
- list.add(linked);
- }
- }
- return list;
- }
- /**
- * 要求excel版本在2007以上
- *
- * @param fileInputStream 文件信息
- * @return
- * @throws Exception
- */
- public static List<List<Object>> readExcel(FileInputStream fileInputStream) throws Exception {
- List<List<Object>> list = new LinkedList<List<Object>>();
- XSSFWorkbook xwb = new XSSFWorkbook(fileInputStream);
- // 讀取第一張表格內容
- XSSFSheet sheet = xwb.getSheetAt(1);
- XSSFRow row = null;
- XSSFCell cell = null;
- for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {
- row = sheet.getRow(i);
- if (row == null) {
- continue;
- }
- List<Object> linked = new LinkedList<Object>();
- for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
- Object value = null;
- cell = row.getCell(j);
- if (cell == null) {
- continue;
- }
- switch (cell.getCellType()) {
- case XSSFCell.CELL_TYPE_STRING:
- value = cell.getStringCellValue();
- break;
- case XSSFCell.CELL_TYPE_NUMERIC:
- if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {
- //System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
- value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;
- } else {
- //System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
- value = cell.getNumericCellValue();
- }
- break;
- case XSSFCell.CELL_TYPE_BOOLEAN:
- value = cell.getBooleanCellValue();
- break;
- case XSSFCell.CELL_TYPE_BLANK:
- break;
- default:
- value = cell.toString();
- }
- if (value != null && !value.equals("")) {
- //單元格不爲空,則加入列表
- linked.add(value);
- }
- }
- if (linked.size()!= 0) {
- list.add(linked);
- }
- }
- return list;
- }
- /**
- * 導出excel
- * @param excel_name 導出的excel路徑(需要帶.xlsx)
- * @param headList excel的標題備註名稱
- * @param fieldList excel的標題字段(與數據中map中鍵值對應)
- * @param dataList excel數據
- * @throws Exception
- */
- public static void createExcel(String excel_name, String[] headList,
- String[] fieldList, List<Map<String, Object>> dataList)
- throws Exception {
- // 創建新的Excel 工作簿
- XSSFWorkbook workbook = new XSSFWorkbook();
- // 在Excel工作簿中建一工作表,其名爲缺省值
- XSSFSheet sheet = workbook.createSheet();
- // 在索引0的位置創建行(最頂端的行)
- XSSFRow row = sheet.createRow(0);
- // 設置excel頭(第一行)的頭名稱
- for (int i = 0; i < headList.length; i++) {
- // 在索引0的位置創建單元格(左上端)
- XSSFCell cell = row.createCell(i);
- // 定義單元格爲字符串類型
- cell.setCellType(XSSFCell.CELL_TYPE_STRING);
- // 在單元格中輸入一些內容
- cell.setCellValue(headList[i]);
- }
- // ===============================================================
- //添加數據
- for (int n = 0; n < dataList.size(); n++) {
- // 在索引1的位置創建行(最頂端的行)
- XSSFRow row_value = sheet.createRow(n + 1);
- Map<String, Object> dataMap = dataList.get(n);
- // ===============================================================
- for (int i = 0; i < fieldList.length; i++) {
- // 在索引0的位置創建單元格(左上端)
- XSSFCell cell = row_value.createCell(i);
- // 定義單元格爲字符串類型
- cell.setCellType(XSSFCell.CELL_TYPE_STRING);
- // 在單元格中輸入一些內容
- cell.setCellValue((dataMap.get(fieldList[i])).toString());
- }
- // ===============================================================
- }
- // 新建一輸出文件流
- FileOutputStream fos = new FileOutputStream(excel_name);
- // 把相應的Excel 工作簿存盤
- workbook.write(fos);
- fos.flush();
- // 操作結束,關閉文件
- fos.close();
- }
- }
excel操作之poi-ooxml
目前市場上流行的對於excel處理的框架大致有兩種:poi和jxl。對於這兩種框架,我們可以做一個簡單的對比: 1 開發團隊:poi是Apache旗下的一個開源項目,由Apache官方維護,jxl好像是一個個人維護的開源項目。
2 各自優點:poi對公式支持較好,jxl不算好 。jxl提供對圖片的支持(僅僅PNG格式),poi支持。(就這一條來看財務軟件就該選poi,而媒體類的軟件就該選jxl了)
3 內存消耗:由於jxl在對資源回收利用方面做了相當的功課,在內存消耗上jxl是略勝於poi的。所以對於大數據量的軟件導入來說,選擇jxl是比較合算的,當然數據量小的基本沒有差別。
4 運行速度: 估計是內存消耗多的緣故,poi對於讀寫速度這一功能做的好像比jxl好了不少,並且支持壓縮excel。
對比了這麼多,對於自己項目該使用哪個框架,應該也十分明顯了(當然這些也都是從網上搜集來的,不保證有錯誤的地方)。
這裏我記錄一下poi的使用吧,都挺簡單的,基本原理都是將excel表格數據提取出來組成一個list。然後對應這個list自己去做循環對應自己數據表的數據就行了。需要說明的一點是如果是數字類型的話,讀出來的數據一般都是以double類型返回給你的,比如你在excel裏面寫的是100,讀取出來的數據就是100.0.這點比較煩人,當然自己做一下處理就好了。
還有一點就是poi也有兩個不同的jar包,分別是處理excel2003和excel2007+的,對應的是poi和poi-ooxml。畢竟poi-ooxml是poi的升級版本,處理的單頁數據量也是百萬級別的,所以我們選擇的也是poi-ooxml。好了,下面就貼上代碼吧,註釋較多,就不多做囉嗦了。,前提是引入包:
以下代碼完全可以作爲一個excel工具類遷移到自己的項目中:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.