應用的poi.jar包版本爲:3.16java
package poi; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcel2 { // 讀取xlsx的數據 public static String readDataExcelx(String filePath) throws IOException{ StringBuilder str = new StringBuilder(); FileInputStream input = null; try { // 打開filePath這個路徑下指定的文件 input = new FileInputStream(filePath); XSSFWorkbook workbook = new XSSFWorkbook(input); // 獲取第一個sheet XSSFSheet sheet0 = workbook.getSheetAt(0); // 迭代行 for (Iterator<Row> rowIterator = sheet0.iterator(); rowIterator.hasNext();) { XSSFRow row = (XSSFRow) rowIterator.next(); // 迭代一行中全部的列 for (Iterator<Cell> iterator = row.cellIterator(); iterator.hasNext();) { XSSFCell cell = (XSSFCell) iterator.next(); // 根據單元的的類型 讀取相應的結果 if (cell.getCellTypeEnum() == CellType.STRING) str.append(cell.getStringCellValue() + "\t"); else if (cell.getCellTypeEnum() == CellType.NUMERIC) str.append(cell.getNumericCellValue() + "\t"); else if (cell.getCellTypeEnum() == CellType.FORMULA) str.append(cell.getCellFormula() + "\t"); } // 換行 str.append("\n"); } } catch (Exception e) { // 上拋異常 throw new IOException(e); } finally { if(input!=null){ try { // 關閉輸入流 input.close(); } catch (IOException e) { e.printStackTrace(); } } } // 返回數據的字符串 return str.toString(); } // 測試讀入的數據 public static void main(String[] args) { String str; try { str = readDataExcelx("d:\\測試.xlsx"); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } }
建立一個WriteExcel類,書寫如下幾個方法apache
package poi; public class WriteExcel { // 設置邊框方法 public static void setBorder(){} // 設置字體方法 public static void getFont(){} // 設置下拉框方法 public static XSSFSheet setXSSFDropdown(){} // 建立Excel方法 public static void createXlsx(){} // 測試main方法 public static void main(String[] args) {} }
由於寫入內容過多,因此將寫入拆分紅幾塊數組
/** * ---------------------設置邊框--------------------------- * @param cellStyle 表格類型對象 * @param topBorder 設置上邊框 * @param bottomBorder 設置下邊框 * @param leftBorder 設置左邊框 * @param rightBorder 設置右邊框 * @param borderStyle 設置邊框類型 */ public static void setBorder(CellStyle cellStyle, boolean topBorder, boolean bottomBorder, boolean leftBorder, boolean rightBorder, BorderStyle borderStyle) { // 若是borderStyle爲空,則設置爲無樣式 if(borderStyle==null){ borderStyle=BorderStyle.NONE; } if (topBorder) { cellStyle.setBorderTop(borderStyle); } if (bottomBorder) { cellStyle.setBorderBottom(borderStyle); } if (leftBorder) { cellStyle.setBorderLeft(borderStyle); } if (rightBorder) { cellStyle.setBorderRight(borderStyle); } }
/** * -----------------得到字體以及配置字體類型--------------------- * @param workbook Excel對象 * @param fontName 字體名 * @param fontSize 字體大小 * @param fontColor 字體顏色 * @param bold 加粗 * @param italic 傾斜 * @param Underline 下劃線 * @return 返回字體 */ public static XSSFFont getFont(XSSFWorkbook workbook, String fontName, int fontSize, int[] fontColor, boolean bold, boolean italic,int Underline) { // 建立字體對象 if (workbook == null) { throw new RuntimeException("workbook值爲空"); } XSSFFont font = workbook.createFont(); // 設置字體名字 if (fontName != null) { font.setFontName(fontName); } // 設置字體顏色 if (fontColor != null) { XSSFColor color = new XSSFColor(); color.setRGB(new byte[] { (byte) fontColor[0], (byte) fontColor[1], (byte) fontColor[2] }); font.setColor(color); } // 設置字體大小 if (fontSize > 0) { font.setFontHeightInPoints((short) fontSize); } // 設置字體加粗 font.setBold(bold); // 設置字體傾斜 font.setItalic(italic); // 設置字體下劃線 font.setUnderline((byte)Underline); // 返回字體 return font; }
/** * -----------------設置下拉框--------------------------- * @param sheetlist 要設置的sheet. * @param textlist 下拉框顯示的內容 * @param firstRow 開始行 * @param endRow 結束行 * @param firstCol 開始列 * @param endCol 結束列 * @return 設置好的sheet. */ public static XSSFSheet setXSSFDropdown(XSSFSheet sheetlist, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) { // 設置數據有效性加載在哪一個單元格上,四個參數分別是:起始行、終止行、起始列、終止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 數據有效性對象 XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheetlist); XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist); XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions); sheetlist.addValidationData(validation); return sheetlist; }
/** * * @param filepath 要建立的xlsx文件目錄 * @param list Object[]數據列表 */ public static void createXlsx(String filepath, List<Object[]> list) throws IOException { // -------------------建立Excel--------------------- // Excel對象 XSSFWorkbook workbook = new XSSFWorkbook(); // 建立一個sheet0 XSSFSheet sheet0 = workbook.createSheet("產品清單"); // -------------------配置表格類型--------------------- // 建立表格類型對象 CellStyle cellStyle=workbook.createCellStyle(); /* * CellStyle.BORDER_DOUBLE 雙邊線 * CellStyle.BORDER_THIN 細邊線 * CellStyle.BORDER_MEDIUM 中等邊線 * CellStyle.BORDER_DASHED 虛線邊線 * CellStyle.BORDER_HAIR 小圓點虛線邊線 * CellStyle.BORDER_THICK 粗邊線 */ // 調用方法setBorder設置表格類型的底邊框 setBorder(cellStyle,true, true, true, true, BorderStyle.DASHED); // 調用方法getFont得到字體對象getFont // ("workbook對象","字體","字體大小","顏色數組(255,255,255),"加粗","傾斜","下劃線(0爲沒下劃線)") XSSFFont font = getFont(workbook, "微軟雅黑", 10, new int[] { 255, 0, 0 }, false, false, 0); // 將字體加入到表格類型中 cellStyle.setFont(font); // 設置內容居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); // -------------------建立表頭--------------------- // 設置表頭要顯示的內容 String[] title = { "編號", "產品名稱", "產品價格", "產品數量", "生產日期" }; // 建立第一行(第一行爲標號爲0) XSSFRow row0 = sheet0.createRow((short) 0); // 循環建立第一行表格(第一列標號爲0,i=開始的列,title.length-1=結束的列) for (int i = 0; i <= title.length - 1; i++) { // 建立表格對象 XSSFCell cell = row0.createCell(i); // 設置表格類型 cell.setCellStyle(cellStyle); // 設置表格對象值 cell.setCellValue(title[i]); // 想合併最後的單元格,則判到最後列後合併單元格 if (i == title.length - 1) { // 建立表格對象 row0.createCell(i + 1).setCellStyle(cellStyle); // 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列) row0.getSheet().addMergedRegion(new CellRangeAddress(0, 0, i, i + 1)); } } // -------------------建立內容-------------------- //設置下拉選項的菜單 String[] dropdownList = { "產品1號", "產品2號", "產品3號" ,"產品4號" }; // 循環生成行N行 for (int rownum = 1; rownum <= list.size() - 1; rownum++) { // 建立行對象 XSSFRow row = sheet0.createRow((short) rownum); // 循環生成行表格 for (int colnum = 0; colnum <= list.get(rownum).length - 1; colnum++) { // 建立表格對象 XSSFCell cells = row.createCell(colnum); // 設置表格類型 cells.setCellStyle(cellStyle); // 從集合中提取數據 cells.setCellValue((String) list.get(rownum - 1)[colnum]); // 判斷是不是第二列,是則加入下拉列表 if (colnum == 1) { //調用方法setXSSFDropdown建立下拉列表 setXSSFDropdown(sheet0, dropdownList, rownum, rownum, colnum, colnum); } // 想合併最後的單元格,則判到最後列後合併單元格 if (colnum == title.length - 1) { // 建立表格對象 row.createCell(colnum + 1).setCellStyle(cellStyle); // 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列) row.getSheet().addMergedRegion(new CellRangeAddress(rownum, rownum, colnum, colnum + 1)); } } } // 建立輸出流 FileOutputStream out = new FileOutputStream(filepath); BufferedOutputStream bos = new BufferedOutputStream(out); // 寫入文件到緩衝流中輸出 workbook.write(bos); bos.close(); }
// 測試 public static void main(String[] args) { try { // 建立測試用的數據 List<Object[]> list = new ArrayList<Object[]>(); list.add(new Object[] { "001", "產品1號", "1000.0", "20", "2017-07-11" }); list.add(new Object[] { "002", "產品2號", "1200.0", "55", "2017-07-12" }); list.add(new Object[] { "003", "產品3號", "1350.0", "42", "2017-07-13" }); list.add(new Object[] { "004", "產品4號", "1400.0", "99", "2017-07-14" }); // 設置保存目錄 String filepath="d://test.xlsx"; // 調用法法 createXlsx(filepath, list); } catch (Exception e) { e.printStackTrace(); } }
往其中插入一行app
package poi; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ModifyExcel { public static void Modify(String filepath) throws IOException { FileInputStream input = null; FileOutputStream out = null; try { // ------讀取Excel到Java中------- input = new FileInputStream(filepath); XSSFWorkbook workbook = new XSSFWorkbook(input); // ------得到Excel中第1個表------- XSSFSheet sheet = workbook.getSheetAt(0); // ------把已有的行往下移動-------- // 設置要移動的是第幾行 int n = 2; // sheet.getLastRowNum()爲獲取最後一行 // shiftRows(開始行,結束行,移動多少行,是否保留行高,從新設置行高); for (int i = sheet.getLastRowNum(); i >= n; i--) { sheet.shiftRows(i, i, 1, true, false); } // ------插入行-------- // 設置要插入的數據 String[] data = new String[] { "001", "產品1號", "1000.0", "20", "2017-07-11" }; // 在第N行插入一行 XSSFRow row = sheet.createRow(n); // 循環建立表格 for (int i = 0; i <= data.length - 1; i++) { XSSFCell cell=row.createCell(i); // 若是是最後的單元格,則判到最後列後合併單元格 if (i == data.length - 1) { // 建立表格對象 row.createCell(i); // 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列) row.getSheet().addMergedRegion(new CellRangeAddress(n, n, i, i + 1)); } cell.setCellValue(data[i]); } // ------建立輸出流-------- out = new FileOutputStream(filepath); BufferedOutputStream bos = new BufferedOutputStream(out); // ------寫入到流-------- workbook.write(bos); } catch (IOException e) { throw new IOException(e); } finally { // ------關閉流-------- if(input!=null){ input.close(); } if(out!=null){ out.close(); } } } public static void main(String[] args){ try { Modify("d:\\test.xlsx"); } catch (IOException e) { e.printStackTrace(); } } }