使用JAVA讀取和寫入EXCEL檔案
阿新 • • 發佈:2019-02-02
首先要下載 poi包和jxl包
讀取部分:
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; 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; /**============================================================ * 版權: * 包: * 修改記錄: * 日期 作者 內容 * ============================================================= * 2014-12-25 shirenchuang * ============================================================*/ /** * @author shirenchuang * */ public class ReadExecl { /*private String fileUrl; public ReadExecl(String fileUrl) { // TODO Auto-generated constructor stub this.fileUrl = fileUrl; }*/ // File file = new File(fileUrl); /** * 讀取Excel的內容,第一維陣列儲存的是一行中格列的值,二維陣列儲存的是多少個行 * @param file 讀取資料的源Excel * @param ignoreRows 讀取資料忽略的行數,比喻行頭不需要讀入 忽略的行數為1 * @return 讀出的Excel中資料的內容 * @throws FileNotFoundException * @throws IOException */ public static List<String[][]> getData(File file,int ignoreRows) throws IOException{ //返回所有工作表的資料 List<String[][]> result = new ArrayList<String[][]>(); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; wb.getNumberOfSheets(); //多個工作表 for(int i=0;i<wb.getNumberOfSheets();i++){ //得到工作表 HSSFSheet hf = wb.getSheetAt(i); //一個工作表的資料 擠得加上1 比如execl加上第一行的列名 總共66 但是getLastRowNum()是65 把列明也算上 String[][] rowResult = new String[hf.getLastRowNum()+1][7]; //每個工作表的多行 for(int rownumber = ignoreRows; rownumber<=hf.getLastRowNum();rownumber++){ //得到的row的行數不確定的 如果那一行後面有空格 有可能會忽略空格列 HSSFRow row = hf.getRow(rownumber); if (row == null) { continue; } //一行的資料 String[] colResult = new String[row.getLastCellNum()]; //得到一行的多個列 /** * 這裡有個問題 就是row.getLastCellNum()有個情況得到的不準確 * 例子:EXECL總共7列資料 但是實際上最後幾列有的為空,它會預設把空的列不計入列值; * 導致的錯誤就是你呼叫寫入方法的時候會有用的列值 會出錯; * */ for(short colnumber = 0;colnumber<row.getLastCellNum();colnumber++){ String value=""; cell=row.getCell(colnumber); //將cell裝換型別 if(cell!=null){ cell.setEncoding(HSSFCell.ENCODING_UTF_16); switch(cell.getCellType()){ case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 匯入時如果為公式生成的資料則無值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; }//switch }//if if (colnumber == 0 && value.trim().equals("")) { // break; } colResult[colnumber]=rightTrim(value); }//for()列 rowResult[rownumber]=colResult; }//for() 行 if(rowResult!=null) result.add(rowResult); }//for工作表 in.close(); return result; } /** * 去掉字串右邊的空格 * @param str 要處理的字串 * @return 處理後的字串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } }
寫入部分
import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; /**============================================================ * 版權: 元亨通訊 版權所有 (c) 2002 - 2012 * 包: * 修改記錄: * 日期 作者 內容 * ============================================================= * 2014-12-25 shirenchuang * ============================================================*/ /** * @author shirenchuang * */ public class WriterExecl { private static String writeUrl =""; public String getWriteUrl() { return writeUrl; } public void setWriteUrl(String writeUrl) { this.writeUrl = writeUrl; } public WriterExecl(String writeUrl ) { // TODO Auto-generated constructor stub this.writeUrl= writeUrl; } /** * * 這是單純的寫EXCEL表格 * **/ public static void writeEx(int row,String[][] data){ WritableWorkbook wwb = null; Label label = null; String file =writeUrl; try { // 建立可寫入的工作簿物件 wwb = Workbook.createWorkbook(new File(file)); if (wwb != null) { // 在工作簿裡建立可寫入的工作表,第一個引數為工作表名,第二個引數為該工作表的所在位置 WritableSheet ws = wwb.createSheet("test", 0); if (ws != null) { /* 新增表結構 */ // 行 for (int i=0;i<row;i++) { // 列 for (int j=0;j<data[i].length;j++) { // Label構造器中有三個引數,第一個為列,第二個為行,第三個則為單元格填充的內容 label = new Label(j, i,data[i][j] ); // 將被寫入資料的單元格新增到工作表 ws.addCell(label); } } // 從記憶體中寫入到檔案 wwb.write(); } System.out.println("路徑為:" + file + "的工作簿寫入資料成功!"); } } catch (Exception e) { System.out.println(e.getMessage()); } finally { try { wwb.close(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
主方法:
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class main { public static void main(String[] args) throws IOException{ ReadExecl re = new ReadExecl(); File file = new File("C:/Users/Administrator/Desktop/test.xls"); WriterExecl we = new WriterExecl("C:/Users/Administrator/Desktop/衢州使用者表.xls"); List<String[][]> result = new ArrayList<String[][]>(); //不忽略行 從0開始 result = re.getData(file, 0); //有多少行 int row = result.get(0).length; //寫入 傳入引數row 不傳column column是不確定的 we.writeEx(row,result.get(0)); } }