应用的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(); } } }