1.使用poi工具
pom.xml中添加依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
2.读取Excel源标题、源数据、总行数、总列数
/** * 读Excel的方法readExcel,该方法的入口参数为一个File对象 * @param file * @return */ public static Map readExcel(File file) { Map map = new HashMap(); try { // 创建输入流,读取Excel InputStream is = new FileInputStream(file.getAbsolutePath()); // jxl提供的Workbook类 jxl.Workbook wb = jxl.Workbook.getWorkbook(is); // Excel的页签数量 int sheet_size = wb.getNumberOfSheets(); if(sheet_size > 1){ return null; } //获取原标题 List oldTitleRow = new ArrayList(); List<Object> outerList = new ArrayList<Object>(); // 每个页签创建一个Sheet对象 jxl.Sheet sheet = wb.getSheet(0); //sheet.getRows()返回该页的总行数 for (int i = 0; i < sheet.getRows(); i++) { Map innerMap = new HashMap(); String cellinfo = ""; // sheet.getColumns()返回该页的总列数 for (int j = 0; j < sheet.getColumns(); j++) { cellinfo = sheet.getCell(j, i).getContents(); //如果是第3行,取出数据作为oldTitleRow行 if(i == 2){ oldTitleRow.add(cellinfo); } if(i > 2){ innerMap.put(j, cellinfo); } } //只取出第3行以及第三之后的数据 if(i > 2){ outerList.add(innerMap); } } //保存源标题、源数据、总行数、总列数 map.put("oldTitleRow", oldTitleRow); map.put("dataList", outerList); map.put("rowNum", sheet.getRows()-3); map.put("columnNum", sheet.getColumns()); return map; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (BiffException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
3.导出excel表格
/** * 导出excel表格 * @param dataList 被导出的数据 * @param cloumnCount 总列数 * @param newTitleRow 标题行 * @param finalXlsxPath 导出路径 */ public static void writeExcel(List<Map> dataList, int cloumnCount,List newTitleRow, String finalXlsxPath) { OutputStream out = null; try { // 获取总列数 int columnNumCount = cloumnCount; // 创建空的Excel文档,并加上title createExcel(finalXlsxPath,"Template", newTitleRow); File finalXlsxFile = new File(finalXlsxPath); Workbook workBook = getWorkbok(finalXlsxFile); // sheet 对应一个工作页 Sheet sheet = workBook.getSheetAt(0); // 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效 out = new FileOutputStream(finalXlsxPath); workBook.write(out); /** * 往Excel中写新数据 */ for (int j = 0; j < dataList.size(); j++) { // 创建一行:从第二行开始,跳过属性列 Row row = sheet.createRow(j + 1); // 得到要插入的每一条记录 Map dataMap = dataList.get(j); for (int k = 0; k < columnNumCount; k++) { String data = dataMap.get(k).toString(); // 在一行内循环 Cell cell = row.createCell(k); cell.setCellValue(data); } } // 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效 out = new FileOutputStream(finalXlsxPath); workBook.write(out); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.flush(); out.close(); } } catch (IOException e) { e.printStackTrace(); } } System.out.println("数据导出成功"); }
4.创建新的excel表格
/** * 创建新excel * @param fileDir excel的路径 * @param sheetName 要创建的表格索引 * @param newTitleRow 要创建的表格标题 */ public static void createExcel(String fileDir,String sheetName, List<String> newTitleRow){ //判断文件是否存在 if(fileExist(fileDir)){ deleteExcel(fileDir); } //创建workbook HSSFWorkbook workbook = new HSSFWorkbook(); //添加Worksheet(不添加sheet时生成的xls文件打开时会报错) HSSFSheet sheet1 = workbook.createSheet(sheetName); //新建文件 FileOutputStream out = null; try { //添加表头 HSSFRow row = workbook.getSheet(sheetName).createRow(0); //创建第一行 for(int i = 0;i < newTitleRow.size();i++){ HSSFCell cell = row.createCell(i); cell.setCellValue(newTitleRow.get(i)); } out = new FileOutputStream(fileDir); workbook.write(out); } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } }
5.判断Excel文件版本
/** * 判断Excel的版本,获取Workbook * @param file * @return */ public static Workbook getWorkbok(File file) { Workbook wb = null; try { FileInputStream in = new FileInputStream(file); if (file.getName().endsWith(EXCEL_XLS)) { //Excel 2003 wb = new HSSFWorkbook(in); } else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010 wb = new XSSFWorkbook(in); } } catch (IOException e) { e.printStackTrace(); } return wb; }
6.其他
/** * 判断文件是否存在. * @param fileDir 文件路径 * @return */ public static boolean fileExist(String fileDir){ boolean flag = false; File file = new File(fileDir); flag = file.exists(); return flag; } /** * 删除文件. * @param fileDir 文件路径 */ public static boolean deleteExcel(String fileDir) { boolean flag = false; File file = new File(fileDir); // 判断目录或文件是否存在 if (!file.exists()) { // 不存在返回 false return flag; } else { // 判断是否为文件 if (file.isFile()) { // 为文件时调用删除文件方法 file.delete(); flag = true; } } return flag; }