1. 程式人生 > >Excel的匯入和匯出功能

Excel的匯入和匯出功能

工作中經常會用到excel的匯入和匯出功能,這裡我提供匯入和匯出類。

匯入類(需要注意的地方我註釋裡面寫好了):


  
  1. package cn.teacheredu.utils;
  2. import java.io.InputStream;
  3. import
    java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.Date;
  7. import
    java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  11. import org.apache.poi.ss.usermodel.Cell;
  12. import org.apache.poi.ss.usermodel.DateUtil;
  13. import org.apache.poi.ss.usermodel.Row;
  14. import org.apache.poi.ss.usermodel.Sheet;
  15. import org.apache.poi.ss.usermodel.Workbook;
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  17. /**
  18. * 被解析的Excel最好是什麼樣的呢?
  19. * 單元格最好都是文字格式,儲存資料前自己去轉換,不用poi帶的轉換。
  20. * 第一列 和最後一列 必須是必填欄位!!!這樣的你用我這個Util,得到的List就很準確了,不會出現多餘的行或列。
  21. * @author TMACJ
  22. * @version 0.000000.002899
  23. */
  24. public class ImportExcelUtil {
  25. private final static String excel2003L = ".xls"; //2003- 版本的excel
  26. private final static String excel2007U = ".xlsx"; //2007+ 版本的excel
  27. static SimpleDateFormat sFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
  28. static short[] yyyyMMdd = { 14, 31, 57, 58, 179, 184, 185, 186, 187, 188};
  29. static short[] HHmmss = { 20, 32, 190, 191, 192};
  30. static List< short[]> yyyyMMddList = Arrays.asList(yyyyMMdd);
  31. static List< short[]> hhMMssList = Arrays.asList(HHmmss);
  32. /**
  33. * 描述:獲取IO流中的資料,組裝成List<List<Object>>物件
  34. * @param in,fileName
  35. * @return
  36. * @throws IOException
  37. */
  38. public List<List<String>> getBankListByExcel(InputStream in,String fileName) throws Exception{
  39. List<List<String>> list = null;
  40. //建立Excel工作薄
  41. Workbook work = this.getWorkbook(in,fileName);
  42. if( null == work){
  43. throw new Exception( "建立Excel工作薄為空!");
  44. }
  45. Sheet sheet = null;
  46. Row row = null;
  47. Cell cell = null;
  48. list = new ArrayList<List<String>>();
  49. //遍歷Excel中所有的sheet
  50. for ( int i = 0; i < work.getNumberOfSheets(); i++) {
  51. sheet = work.getSheetAt(i);
  52. if(sheet== null){ continue;}
  53. int totalCell = sheet.getRow( 0).getPhysicalNumberOfCells(); //標題行一共有多少列
  54. //遍歷當前sheet中的所有行
  55. for ( int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum()+ 1; j++) {
  56. row = sheet.getRow(j);
  57. if(row== null || validateRow(row) || row.getPhysicalNumberOfCells() < totalCell){ continue;} //3個條件,有一個為true就不會往list里加,不僅過濾空行還過濾了列數不夠的行,這點要注意,要求表中前後的列都是必填的。
  58. //遍歷所有的列
  59. List<String> li = new ArrayList<String>();
  60. for ( int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
  61. cell = row.getCell(y);
  62. li.add( this.getCellData(cell));
  63. }
  64. list.add(li);
  65. }
  66. // 簡單起見,這裡只解析第一個工作簿!
  67. break;
  68. }
  69. work.close();
  70. return list;
  71. }
  72. // 過濾空行,(其中一行的資料的確都為空,可是其原本的格式還在,並沒有連帶刪除,這樣計算出來的行數就不真實,比真實的大)
  73. private boolean validateRow(Row row) throws Exception{
  74. // for (Cell cell : row) {
  75. //
  76. // }
  77. //只判斷第一列。第一列為空就代表這行的資料無效
  78. if (row.getCell( 0).getCellType() == Cell.CELL_TYPE_BLANK || "".equals( this.getCellData(row.getCell( 0)))) {
  79. return true;
  80. }
  81. return false; //不是空行
  82. }
  83. /**
  84. * 描述:根據檔案字尾,自適應上傳檔案的版本
  85. * @param inStr,fileName
  86. * @return
  87. * @throws Exception
  88. */
  89. public Workbook getWorkbook(InputStream inStr,String fileType) throws Exception{
  90. Workbook wb = null;
  91. if(excel2003L.equals(fileType)){
  92. wb = new HSSFWorkbook(inStr); //2003-
  93. } else if(excel2007U.equals(fileType)){
  94. wb = new XSSFWorkbook(inStr); //2007+
  95. } else{
  96. throw new Exception( "解析的檔案格式有誤!");
  97. }
  98. return wb;
  99. }
  100. /**
  101. * 獲取單元中值(字串型別)
  102. *
  103. * @param cell
  104. * @return
  105. * @throws Exception
  106. */
  107. public String getCellData(Cell cell) throws Exception {
  108. String cellValue = "";
  109. if (cell != null) {
  110. try {
  111. switch (cell.getCellType()) {
  112. case Cell.CELL_TYPE_BLANK: //空白
  113. cellValue = "";
  114. break;
  115. case Cell.CELL_TYPE_NUMERIC: //數值型 0----日期型別也是數值型的一種
  116. if (DateUtil.isCellDateFormatted(cell)) {
  117. short format = cell.getCellStyle().getDataFormat();
  118. if (yyyyMMddList.contains(format)) {
  119. sFormat = new SimpleDateFormat( "yyyy-MM-dd");
  120. } else if (hhMMssList.contains(format)) {
  121. sFormat = new SimpleDateFormat( "HH:mm:ss");
  122. }
  123. Date date = cell.getDateCellValue();
  124. cellValue = sFormat.format(date);
  125. } else {
  126. cell.setCellType(Cell.CELL_TYPE_STRING);
  127. cellValue = replaceBlank(cell.getStringCellValue());
  128. //Double numberDate = new BigDecimal(cell.getNumericCellValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();//似乎還是有點問題
  129. //cellValue = numberDate + "";
  130. }
  131. break;
  132. case Cell.CELL_TYPE_STRING: //字串型 1
  133. cellValue = replaceBlank(cell.getStringCellValue());
  134. break;
  135. case Cell.CELL_TYPE_FORMULA: //公式型 2
  136. cell.setCellType(Cell.CELL_TYPE_STRING);
  137. cellValue = replaceBlank(cell.getStringCellValue());
  138. break;
  139. case Cell.CELL_TYPE_BOOLEAN: //布林型 4
  140. cellValue = String.valueOf(cell.getBooleanCellValue());
  141. break;
  142. case Cell.CELL_TYPE_ERROR: //錯誤 5
  143. cellValue = "!#REF!";
  144. break;
  145. }
  146. } catch (Exception e) {
  147. throw new Exception( "讀取Excel單元格資料出錯:" + e.getMessage());
  148. }
  149. }
  150. return cellValue;
  151. }
  152. public static String replaceBlank(String source) {
  153. String dest = "";
  154. if (source != null) {
  155. Pattern p = Pattern.compile( "\t|\r|\n");
  156. Matcher m = p.matcher(source);
  157. dest = m.replaceAll( "");
  158. }
  159. return dest.trim();
  160. }
  161. }

匯出類(.XLS格式):


  
  1. package cn.teacheredu.utils;
  2. import java.io.OutputStream;
  3. import java.net.URLEncoder;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.List;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import org.apache.commons.lang.StringUtils;
  10. import org.apache.commons.lang3.time.DateFormatUtils;
  11. import org.apache.poi.hssf.usermodel.HSSFCell;
  12. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  13. import org.apache.poi.hssf.usermodel.HSSFFont;
  14. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  15. import org.apache.poi.hssf.usermodel.HSSFRow;
  16. import org.apache.poi.hssf.usermodel.HSSFSheet;
  17. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  18. import org.apache.poi.hssf.util.HSSFColor;
  19. import org.apache.poi.ss.util.CellRangeAddress;
  20. /**
  21. * 通用的匯出Excel類,如果需要自定義格式的,參照此類自己再寫類或方法來實現
  22. * dataList裡的每一個Object陣列一個元素(object[0])都是序號,不可放真實資料
  23. * @author TMACJ
  24. */
  25. public class ExportExcelUtil {
  26. private String title; // 匯出表格的表名
  27. private String[] rowName; // 匯出表格的列名
  28. private List<Object[]> dataList = new ArrayList<Object[]>(); // 物件陣列的List集合
  29. private HttpServletResponse response;
  30. private HttpServletRequest request;
  31. /**
  32. * 例項化匯出類
  33. * @param title 匯出表格的表名,最好是英文,中文可能出現亂碼
  34. * @param rowName 匯出表格的列名陣列
  35. * @param dataList 物件陣列的List集合
  36. * @param response
  37. */
  38. public ExportExcelUtil(String title,String[] rowName,List<Object[]> dataList, HttpServletRequest request, HttpServletResponse response){
  39. this.title=title;
  40. this.rowName=rowName;
  41. this.dataList=dataList;
  42. this.response = response;
  43. this.request = request;
  44. }
  45. // 匯出資料
  46. public void exportData() throws Exception{
  47. 相關推薦

    Excel匯入匯出功能

    工作中經常會用到excel的匯入和匯出功能,這裡我提供匯入和匯出類。 匯入類(需要注意的地方我註釋裡面寫好了): package cn.teacheredu.utils;

    Excel匯入匯出功能實現

    工作中經常會用到excel的匯入和匯出功能,這裡我提供匯入和匯出類。 匯入類(需要注意的地方我註釋裡面寫好了): package cn.teacheredu.utils; import java.io.InputStream; import java.text.Simpl

    Oracle 對於.dmp檔案的匯入匯出功能 問題解決

    因為需要,匯入磁碟上的.dmp檔案到資料庫裡,但是直接在命令列裡 imp a/[email protected] file = 'D:\dmp\a.dmp' full = y是執行不成功的而且報錯。 IMP-00013: only a DBA can import

    ASP.NET MVC5+EF6+EasyUI 後臺管理系統(88)-Excel匯入匯出-主從表結構匯出

    前言 前面一篇詳細講解了匯入匯出,本節演示混合結構的匯出功能!同時提供程式碼下載.. 先看效果圖:這個一個混合的Excel,列表與自定義資訊的混合!   我們的步驟大概分為以下幾步 1.模擬資料庫資料 2.建立工作簿 3.填充固定資料 4.合併單元格 5.處理動態資料  

    Apache POI元件操作Excel(匯入匯出)

    Apache的POI元件是Java操作Microsoft Office辦公套件的強大API,其中對Word,Excel和PowperPoint都有支援,當然使用較多的還是Excel,因為Word和PowerPoint用程式動態操作的應用較少。那麼本文就結合POI來介紹一下

    SpringBoot通過WorkBook快速實現對Excel匯入匯出(包括資料校驗)

    之前轉載過一篇對Excel基本操作相關的文章,這篇文章的瀏覽量迅速飆升,以至於在我部落格的熱門文章中排到了第三的位置,不過那篇轉載的文章實用性差並且講解不是很清晰,所以打算趁著今天休息,寫一篇關於SpringBoot通過WorkBook快速實現對Excel的匯入、匯出、資料校驗的文章,也是便於日後查

    PDF電子發票解析成excel,支援批量解析匯出功能

    PDF電子發票解析成excel,支援批量解析和匯出功能 https://blog.csdn.net/m0_38035006/article/details/84880018#comments https://www.promiseblog.cn 合計稅額 13.27 貨物名稱 (詳見銷貨清單) 受票方識

    【MATLAB】匯入匯出Excel資料

    1 寫在前面 MATLAB 中有時候需要用到外部的資料進行模擬計算,或者有時需要把 MATLAB 中的資料匯出到外部表格,這就用到 Excel 與 MATLAB 之間的命令函式。 2 匯入 A=xlsread('xxx.xlsx') # xxx 為檔名稱 其中

    視訊編輯器-MovieMator簡潔使用-功能快速入門-建立專案、匯入匯出

    視訊編輯器-MovieMator 簡潔使用-建立專案、匯入和匯出          MovieMator是一個簡單但功能強大的免費視訊編輯軟體。它不僅允許使用者進行基本的編輯工作,如修剪、裁剪、分

    Java實現Excel匯入匯出

    一、下載jxl.jar包匯入到工程中 二、新建Book.java package com.cc.reflection; public class Book { private int id; private String name; private Strin

    在C#中關於excel匯入匯出操作

    一、先來看看最常見的匯入操作吧!private void Import() { //開啟excel選擇框 OpenFileDialog frm = new OpenFileDi

    PHP Excel匯入匯出功能

     為什麼做這件事:也許原因大家都各不相同,可能有的是為了工作,可能有的是為了學習,我的原因很簡單,就是為了玩,正應為好玩,才沒事的時候搞一搞。 這件事情很簡單,你需要引入一個github庫 maatwebsite/excel 然後http://www.maatwebsi

    使用PHPExcel實現Excel檔案的匯入匯出

    在之前有寫過一篇文章講述了使用,這種方式生成Excel檔案,生成速度很快,但是有缺點是: 1.單純的生成Excel檔案,生成的檔案沒有樣式,單元格屬性(填充色,寬度,高度,邊框顏色...)不能自定義; 2.生成的檔案雖然可以開啟,但是相容性很差,每次開啟,都會報一個警告:今

    匯入匯出Excel通用方法

    package com.javen.service; import java.io.File; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List

    王昕的 java 下Excel匯入匯出,資料校驗

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import j

    java匯入匯出excel文件(支援xls,xlsx格式)

    好久沒寫部落格了,寫個簡單的估計也是常用的,歡迎評判指導交流 相關jar包,可以先百度,因為時間問題後續再補上 package main.java; import java.io.File; import java.io.FileInputStream; import

    Java中Excel表格資料的匯入匯出步驟方法

    Java Excel API既可以從本地檔案系統的一個檔案(.xls),也可以從輸入流中讀取Excel資料表。讀取Excel資料表的第一步是建立Workbook(術 語:工作薄),下面的程式碼片段舉例說明了應該如何操作:(完整程式碼見ExcelReading.java)

    在Myeclipse中完成程式碼自動填充,自動提示功能的方法:以及如何在匯入匯出配置檔案。

    1.點選  java-editor-Content Assist 找到 Auto  Activation triggers for java”這個選項。其實就是指觸發程式碼提示的就是“.”這個符號。 將它改成.abcdefghijklmnopqrstuvwxyz(, 2.專

    如何使用JavaScript匯入匯出Excel檔案

    本文由葡萄城技術團隊於原創並首發 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。   JavaScript是一個涵蓋多種框架、直譯式、可以輕鬆自定義客戶端的指令碼語言,在 Web 應用程式中,更加易於編碼和維護。而Excel 作為一款深受使用

    4.5-匯入匯出容器

    1.匯出容器 如果要匯出本地某個容器,可以使用 docker export 命令。 格式為:docker export [OPTIONS] CONTAINER 主要選項: -o, --output string :匯出到一個指定檔案中。 $&n