java中excel文件的导入和导出
Posted dsn727455218
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中excel文件的导入和导出相关的知识,希望对你有一定的参考价值。
如有需要可以加我Q群【308742428】大家一起讨论技术,提供技术支持。
后面会不定时为大家更新文章,敬请期待。
前端上传excel文件到后台,后台接收后保存数据到数据库。
这里需要说明的一点是前端如果是用form提交那么需要在form里添加属性
method=‘post‘ enctype="multipart/form-data"
如果是用ajax提交的那么需要在请求方法添加添加
processData: false, contentType : false, // 不要设置Content-Type请求头
后台接收的action:
这里是把request请求转化为MultipartFile,表示当前请求是一个文件上传
//批量添加 @ResponseBody @RequestMapping(value = "/addAllPersonnel",method = RequestMethod.POST) @CrossOrigin public Map<String,Object> addpersonnel(HttpServletRequest request) { Map<String,Object> map = new HashMap<>(); try { String userToken = request.getParameter("token"); Administrator user = (Administrator) CacheUtils.get(userToken); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile file = multipartRequest.getFile("excel_file"); // 1.取得上传目录父路径 String baseDir =request.getServletContext().getRealPath("/")+ "tmp/"; // 2.重命名上传文件 String fileName = "excel_" + new Date().getTime() + file.getOriginalFilename().replaceAll("^[\s\S]+(\.\w+)", "$1"); // 3.建立文件路径 File _baseDir = new File(baseDir); if (!_baseDir.exists() && !_baseDir.mkdir()){ } // 4.转储为文件 File localFile = new File(baseDir + fileName); file.transferTo(localFile); personnelService.addAllPersonnel(localFile); map.put("code",200); map.put("msg","添加成功"); return map; }catch (Exception e){ map.put("data",""); map.put("code",400); map.put("msg","添加失败"); return map; } }
service实现类里对应的方法:
Personnel是一个实体类,里面的字段根据需求自己写
//批量添加 public void addAllPersonnel(File file) { try { // 1.将file文件内容转为list集合 List<List<Object>> list = ExcelUtils.importExcel2Collection(file, 0); // 2.循环生成对象,并存入数据库 Personnel personnel = new Personnel(); int size = list.size(); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (int i=1;i<size;i++){ List<Object> tmp = list.get(i); String serialnumber = (String) tmp.get(0); //学号重复的不添加 int query = personnelDao.query(serialnumber); if (query!=0){ continue; } personnel.setSerialnumber(serialnumber); personnel.setUsername((String) tmp.get(1)); personnel.setType("学生"); personnel.setGrade((String) tmp.get(2)); personnel.setBirthday((String) tmp.get(3)); personnel.setSex("男".equals((String) tmp.get(4))?1:2); personnel.setInputtingperson((String) tmp.get(5)); personnel.setPhone((String) tmp.get(6)); personnel.setParrent((String) tmp.get(7)); personnel.setParrentPhone((String) tmp.get(8)); personnel.setAge((String) tmp.get(9)); personnel.setGroupManager((String) tmp.get(10)); personnel.setSchool((String) tmp.get(11)); personnel.setHint((String) tmp.get(12)); personnel.setWeight((String) tmp.get(13)); personnel.setBlood((String) tmp.get(14)); personnel.setAddress((String) tmp.get(15)); personnel.setHobby((String) tmp.get(16)); personnel.setJdTime(simpleDateFormat.format(new java.util.Date())); //保存到数据库 personnelDao.addpersonnel(personnel); } }catch (Exception e){ System.out.println(e); } }
下载excel,这里我是从数据库查出需要都的数据,然后遍历list添加到excel里面。
前端请求地址就是action的地址,主要action我们这里定义的是void没有返回类型。
/** * 下载 * @return */ @ResponseBody @RequestMapping("/download") @CrossOrigin public void download(Paging paging, String query, HttpServletRequest request, HttpServletResponse response) { Map<String,Object> map = new HashMap<>(); try { List<Personnel> likepersonnel = personnelService.likepersonnel(paging); if (likepersonnel.size()==0){ map.put("data",""); map.put("code",404); }else{ // 文件名 String filename = "数据.xls"; ExcelData data = new ExcelData(); data.setName("数据"); List<String> titles = new ArrayList(); titles.add("学号"); titles.add("姓名"); titles.add("班级"); titles.add("出生年月"); titles.add("性别"); titles.add("建档人"); titles.add("手机号"); titles.add("家长"); titles.add("家长手机"); titles.add("年龄"); titles.add("班主任"); titles.add("学校"); titles.add("身高"); titles.add("体重"); titles.add("血型"); titles.add("家庭地址"); titles.add("爱好"); data.setTitles(titles); List<List<Object>> rows = new ArrayList(); for (int i=0;i<likepersonnel.size();i++){ List<Object> row1 = new ArrayList(); row1.add(likepersonnel.get(i).getSerialnumber()); row1.add(likepersonnel.get(i).getUsername()); row1.add(likepersonnel.get(i).getGrade()); row1.add(likepersonnel.get(i).getBirthday()); int sex = likepersonnel.get(i).getSex(); String se="男"; if (sex!=1){ se="女"; } row1.add(se); row1.add(likepersonnel.get(i).getInputtingperson()); row1.add(likepersonnel.get(i).getPhone()); row1.add(likepersonnel.get(i).getParrent()); row1.add(likepersonnel.get(i).getParrentPhone()); row1.add(likepersonnel.get(i).getAge()); row1.add(likepersonnel.get(i).getGroupManager()); row1.add(likepersonnel.get(i).getSchool()); row1.add(likepersonnel.get(i).getHint()); row1.add(likepersonnel.get(i).getWeight()); row1.add(likepersonnel.get(i).getBlood()); row1.add(likepersonnel.get(i).getAddress()); row1.add(likepersonnel.get(i).getHobby()); rows.add(row1); data.setRows(rows); } ExcelUtils.exportExcel(response,filename,data); } }catch (Exception e){ map.put("data",""); map.put("code",400); } }
这里面我们用到了一个ExcelData实体类,是用来封装excel的。
import java.io.Serializable; import java.util.List; public class ExcelData implements Serializable { private static final long serialVersionUID = 4454016249210520899L; /** * 表头 */ private List<String> titles; /** * 数据 */ private List<List<Object>> rows; /** * 页签名称 */ private String name; public List<String> getTitles() { return titles; } public void setTitles(List<String> titles) { this.titles = titles; } public List<List<Object>> getRows() { return rows; } public void setRows(List<List<Object>> rows) { this.rows = rows; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
还有ExcelUtils工具类,里面包含创建excel设置一些属性样式的方法都注释,自己看。
import com.ebatis.impl.Init; import com.ebatis.pojo.ActionContext; import com.ebatis.pojo.SheetInfo; import com.zkkz.entily.Personnel; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFRichTextString; 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.hssf.util.HSSFColor; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.PaneInformation; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; //excel工具类 public class ExcelUtils { public static List<Personnel> readFile(String file){ return null; } /** * 下载文件 * @param response * @param fileName * @param data * @throws Exception */ public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception { // 告诉浏览器用什么软件可以打开此文件 response.setHeader("content-Type", "application/vnd.ms-excel"); // 下载文件的默认名称 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); exportExcel(data, response.getOutputStream()); } /** * 创建 表格 * @param data * @param out * @throws Exception */ public static void exportExcel(ExcelData data, OutputStream out) throws Exception { XSSFWorkbook wb = new XSSFWorkbook(); try { String sheetName = data.getName(); if (null == sheetName) { sheetName = "Sheet1"; } XSSFSheet sheet = wb.createSheet(sheetName); writeExcel(wb, sheet, data); wb.write(out); } finally { wb.close(); } } /** * 将数据写入表格 * @param wb * @param sheet * @param data */ private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) { int rowIndex = 0; rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles()); writeRowsToExcel(wb, sheet, data.getRows(), rowIndex); autoSizeColumns(sheet, data.getTitles().size() + 1); } /** * 写入表头 * @param wb * @param sheet * @param titles * @return */ private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) { int rowIndex = 0; int colIndex = 0; Font titleFont = wb.createFont();//获取字体 titleFont.setFontName("simsun");//设置字体名称(宋体) titleFont.setBold(true);//设置字体加粗 titleFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色 XSSFCellStyle titleStyle = wb.createCellStyle();//获取单元格样式 titleStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中) titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中) titleStyle.setFillForegroundColor(createXssfColor("#FFFFFF"));//设置单元格前景色(白色) titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//指定图案和纯色单元格填充的单元格填充信息(实心前景) titleStyle.setFont(titleFont);//设置字体样式 setBorder(titleStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色) Row titleRow = sheet.createRow(rowIndex);//在该工作簿中创建第一行. colIndex = 0; for (String field : titles) {//循环创建列 Cell cell = titleRow.createCell(colIndex); cell.setCellValue(field); cell.setCellStyle(titleStyle); colIndex++; } rowIndex++;//将行数++ 返回用于下面添加数据 return rowIndex; } /** * 将数据写入 * @param wb * @param sheet * @param rows * @param rowIndex * @return */ private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) { int colIndex = 0; Font dataFont = wb.createFont();//获取字体 dataFont.setFontName("simsun");//设置字体名称(宋体) dataFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色 XSSFCellStyle dataStyle = wb.createCellStyle();//获取单元格样式 dataStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中) dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中) dataStyle.setFont(dataFont);//设置字体样式 setBorder(dataStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色) for (List<Object> rowData : rows) {//循环写入数据 Row dataRow = sheet.createRow(rowIndex); colIndex = 0; for (Object cellData : rowData) { Cell cell = dataRow.createCell(colIndex); if (cellData != null) { cell.setCellValue(cellData.toString()); } else { cell.setCellValue(""); } cell.setCellStyle(dataStyle); colIndex++; } rowIndex++; } return rowIndex; } /** * 自动调整大小 * @param sheet * @param columnNumber */ private static void autoSizeColumns(Sheet sheet, int columnNumber) { for (int i = 0; i < columnNumber; i++) { int orgWidth = sheet.getColumnWidth(i); sheet.autoSizeColumn(i, true); int newWidth = (int) (sheet.getColumnWidth(i) + 100); if (newWidth > orgWidth) { sheet.setColumnWidth(i, newWidth); } else { sheet.setColumnWidth(i, orgWidth); } } } /** * 设置表格样式 * @param style * @param border * @param color */ private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) { style.setBorderTop(border); style.setBorderLeft(border); style.setBorderRight(border); style.setBorderBottom(border); style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color); style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color); style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color); style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color); } /** * 将rgb颜色码 转换为 XSSFColor * @param color * @return */ private static XSSFColor createXssfColor(String color) { int[] rgbColor = hexToRgb(color); XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2])); return xssfColor; } /** * 将颜色码 转换为 r g b * @param hex * @return */ public static int[] hexToRgb(String hex) { String colorStr = hex; if (hex.startsWith("#")) { colorStr = hex.substring(1); } if (StringUtils.length(colorStr) == 8) { colorStr = hex.substring(2); } int r= Integer.valueOf( colorStr.substring( 0, 2 ), 16 ); int g= Integer.valueOf( colorStr.substring( 2, 4 ), 16 ); int b= Integer.valueOf( colorStr.substring( 4, 6 ), 16 ); return new int[] { r, g, b }; } /** * Description: 将对象集合写入到excel中 eq:对象的属性应和excel的header对应 <BR> * * @author dsn * @date 2017年9月15日 下午3:55:57 * @return * @version 1.0 */ public static boolean exportExcel(List<Personnel> personnels, String fileName, HttpServletResponse response) throws FileNotFoundException, UnsupportedEncodingException { // 告诉浏览器用什么软件可以打开此文件 response.setHeader("content-Type", "application/vnd.ms-excel"); // 下载文件的默认名称 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); HSSFWorkbook mWorkbook = new HSSFWorkbook(); HSSFSheet mSheet = mWorkbook.createSheet("数据"); // 创建Excel标题行,第一行。 HSSFRow headRow = mSheet.createRow(0); headRow.createCell(0).setCellValue("学号"); headRow.createCell(1).setCellValue("姓名"); headRow.createCell(2).setCellValue("班级"); headRow.createCell(3).setCellValue("出生年月"); headRow.createCell(4).setCellValue("性别"); headRow.createCell(5).setCellValue("建档人"); headRow.createCell(6).setCellValue("手机号"); headRow.createCell(7).setCellValue("家长"); headRow.createCell(8).setCellValue("家长手机"); headRow.createCell(9).setCellValue("年龄"); headRow.createCell(10).setCellValue("班主任"); headRow.createCell(11).setCellValue("学校"); headRow.createCell(12).setCellValue("身高"); headRow.createCell(13).setCellValue("体重"); headRow.createCell(14).setCellValue("血型"); headRow.createCell(15).setCellValue("家庭地址"); headRow.createCell(16).setCellValue("爱好"); // 往Excel表中写入3行测试数据。 for (int i=0;i<personnels.size();i++){ createCell(personnels.get(i), mSheet); } // File xlsFile = new File(path); // mWorkbook.write(xlsFile);// 或者以流的形式写入文件 mWorkbook.write(new FileOutputStream(xlsFile)); try { mWorkbook.write(response.getOutputStream()); // mWorkbook.write(xlsFile); mWorkbook.close(); return false; } catch (IOException e) { e.printStackTrace(); } return false; } // 创建Excel的一行数据。 private static void createCell(Personnel personnel,HSSFSheet sheet) { HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); dataRow.createCell(0).setCellValue(personnel.getSerialnumber()); dataRow.createCell(1).setCellValue(personnel.getUsername()); dataRow.createCell(2).setCellValue(personnel.getGrade()); dataRow.createCell(3).setCellValue(personnel.getBirthday()); int sex = personnel.getSex(); String se="男"; if (sex!=1){ se="女"; } dataRow.createCell(4).setCellValue(se); dataRow.createCell(5).setCellValue(personnel.getInputtingperson()); dataRow.createCell(6).setCellValue(personnel.getPhone()); dataRow.createCell(7).setCellValue(personnel.getParrent()); dataRow.createCell(8).setCellValue(personnel.getParrentPhone()); dataRow.createCell(9).setCellValue(personnel.getAge()); dataRow.createCell(10).setCellValue(personnel.getGroupManager()); dataRow.createCell(11).setCellValue(personnel.getSchool()); dataRow.createCell(12).setCellValue(personnel.getHint()); dataRow.createCell(13).setCellValue(personnel.getWeight()); dataRow.createCell(14).setCellValue(personnel.getBlood()); dataRow.createCell(15).setCellValue(personnel.getAddress()); dataRow.createCell(16).setCellValue(personnel.getHobby()); } /** * Description:将excel读入到对象集合中 <BR> * * @author dsn * @date 2017年9月15日 下午3:56:53 * @param file * @param sheetIndex * @return * @version 1.0 */ public static List<List<Object>> importExcel2Collection(File file, int sheetIndex) { List<List<Object>> list = new LinkedList<List<Object>>(); Object value = null; int counter = 0; Workbook wb = null; try { wb = new HSSFWorkbook(new FileInputStream(file)); } catch (OfficeXmlFileException e) { try { wb = new XSSFWorkbook(new FileInputStream(file)); } catch (IOException e1) { System.out.println("excel读入到对象异常,不支持的excel类型!,"+e); return null; } } catch (Exception e) { System.out.println("excel读入到对象异常,不支持的excel类型!,"+e); return null; } Sheet sheet = wb.getSheetAt(sheetIndex); if (sheet == null) return null; Row row; Cell cell; for (int i = sheet.getFirstRowNum(); counter < sheet.getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null) continue; else counter++; List<Object> linked = new LinkedList<Object>(); for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { cell = row.getCell(j); if (cell == null) { value = ""; linked.add(value); continue; } DecimalFormat df = new DecimalFormat("0");// 格式化 number String SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化日期字符串 DecimalFormat nf = new DecimalFormat("0");// 格式化数字 switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: if ("@".equals(cell.getCellStyle().getDataFormatString())) { value = df.format(cell.getNumericCellValue()); } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { value = nf.format(cell.getNumericCellValue()); } else { value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); } break; case XSSFCell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: value = ""; break; default: value = cell.toString(); } linked.add(value); } list.add(linked); } return list; } }
调用下载方法会用XSSFWorkbook类的write方法把文件流传到前端。
wb.write(out);
out就是response.getOutputStream() 。
excel的导入导出功能已经完成,工具类可以拿过去使用,注意添加jar依赖。
<!--文件读取--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
注意两个包的版本要一致。
以上是关于java中excel文件的导入和导出的主要内容,如果未能解决你的问题,请参考以下文章