1.POI导入
1.首先从页面获取文件
- //定义一个File属性接收导入的xsl文件
- private File regionFile;
- public void setRegionFile(File regionFile) {
- this.regionFile = regionFile;
- }
2.使用POI读取xsl文件,并创建workbook
- public String importXsl() throws FileNotFoundException, IOException {
- //使用POI读取xsl文件
- HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(regionFile));
- //当前标签页
- HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
- List<Region> regionList = new ArrayList();
- //遍历得到row每行
- for (Row row : sheetAt) {
- //判断第一行并去掉它
- int rowNum = row.getRowNum();
- if(rowNum == 0) {
- continue;
- }
- String id = row.getCell(0).getStringCellValue();
- String province = row.getCell(1).getStringCellValue();
- String city = row.getCell(2).getStringCellValue();
- String district = row.getCell(3).getStringCellValue();
- String postcode = row.getCell(4).getStringCellValue();
- //将省份,城市,区域字符串合并
- String shortcode = province.substring(0, province.length() - 1) + city.substring(0, city.length() - 1) + district.substring(0, district.length() - 1);
- //使用pingyin4j 将汉字转为拼音
- String[] headByString = PinYin4jUtils.getHeadByString(shortcode);
- shortcode = StringUtils.join(headByString);
- String citycode = PinYin4jUtils.hanziToPinyin(city,"");
-
- //将参数封装到Region对象
- Region region = new Region(id, province, city, district, postcode, shortcode, citycode, null);
- regionList.add(region);
- }
- //将list集合给service进行保存(使用list存储,只开启一个事务,效率提升)
- regionService.importXsl(regionList);
- return NONE;
- }
2.POI导出xls文件
1.先查询数据库得到需要的数据(我这里是用list<Subarea>存的结果集)
- //得到所有的分区数据
- List<Subarea> findAll = suberareaService.findAll();
2.在内存中先创建一个excuel文件3.与导入xls相反,创建sheet标签页和row行
//先在内存中创建一个excel文件 HSSFWorkbook workbook = new HSSFWorkbook();
- //创建标签页
- HSSFSheet sheet = workbook.createSheet("分区数据");
4.先创建首行的信息
//创建首行row信息 HSSFRow firstRow = sheet.createRow(0); firstRow.createCell(0).setCellValue("分区编号"); firstRow.createCell(1).setCellValue("开始编号"); firstRow.createCell(2).setCellValue("结束编号"); firstRow.createCell(3).setCellValue("位置信息"); firstRow.createCell(4).setCellValue("省市区");
5.遍历数据库查询的结果,将结果存到Excel文件中
//将数据库中数据放入 for (Subarea subarea : findAll) { HSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1); row.createCell(0).setCellValue(subarea.getSubareaid());; row.createCell(1).setCellValue(subarea.getStartnum());; row.createCell(2).setCellValue(subarea.getEndnum());; row.createCell(3).setCellValue(subarea.getPosition());; row.createCell(4).setCellValue(subarea.getRegion().getName());; }
6.将已经封装好的文件传给客户端(重点)(一个流,两个头)
6.1首先通过文件的名称后缀,查询得到设置传输格式的ContextType
//第三步:使用输出流进行文件下载(一个流、两个头) String filename = "分区数据.xls"; //得到文件类型 String contentType = ServletActionContext.getServletContext().getMimeType(filename);
6.2设置传输类型,创建输出流
ServletOutputStream out = ServletActionContext.getResponse().getOutputStream(); //储存文件类型格式 like(text/html;charset=utf-8) ServletActionContext.getResponse().setContentType(contentType);
6.3得到客户端的类型,根据类型将文件名称编码(主要是汉字会造成乱码,不同的浏览器编码格式不同)
//得到客户端的类型,根据类型将文件名称继续编码 String agent = ServletActionContext.getRequest().getHeader("User-Agent"); //使用工具类 根据User-Agent(浏览器类型)来编码文件名 filename = FileUtils.encodeDownloadFilename(filename, agent); //将得到的文件名称放入到响应头中 ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename="+filename);
6.4直接使用POI输出即可
//使用POI方法写回文件 workbook.write(out);
POI数据库数据转Excel并输出全部代码
- public String exportXls() throws IOException {
- //得到所有的分区数据
- List<Subarea> findAll = suberareaService.findAll();
-
- //使用POI技术将数据转为xsl文件
- //先在内存中创建一个excel文件
- HSSFWorkbook workbook = new HSSFWorkbook();
- //创建标签页
- HSSFSheet sheet = workbook.createSheet("分区数据");
- //创建首行row信息
- HSSFRow firstRow = sheet.createRow(0);
- firstRow.createCell(0).setCellValue("分区编号");
- firstRow.createCell(1).setCellValue("开始编号");
- firstRow.createCell(2).setCellValue("结束编号");
- firstRow.createCell(3).setCellValue("位置信息");
- firstRow.createCell(4).setCellValue("省市区");
- //将数据库中数据放入
- for (Subarea subarea : findAll) {
- HSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);
- row.createCell(0).setCellValue(subarea.getSubareaid());;
- row.createCell(1).setCellValue(subarea.getStartnum());;
- row.createCell(2).setCellValue(subarea.getEndnum());;
- row.createCell(3).setCellValue(subarea.getPosition());;
- row.createCell(4).setCellValue(subarea.getRegion().getName());;
- }
- //第三步:使用输出流进行文件下载(一个流、两个头)
- String filename = "分区数据.xls";
- //得到文件类型
- String contentType = ServletActionContext.getServletContext().getMimeType(filename);
- ServletOutputStream out = ServletActionContext.getResponse().getOutputStream();
- //储存文件类型格式 like(text/html;charset=utf-8)
- ServletActionContext.getResponse().setContentType(contentType);
-
- //得到客户端的类型,根据类型将文件名称继续编码
- String agent = ServletActionContext.getRequest().getHeader("User-Agent");
- //使用工具类 根据User-Agent(浏览器类型)来编码文件名
- filename = FileUtils.encodeDownloadFilename(filename, agent);
- //将得到的文件名称放入到响应头中
- ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename="+filename);
- //使用POI方法写回文件
- workbook.write(out);
- return NONE;
-
- }
通过请求头的User-Agent 判断浏览器类型并将文件名称编码的工具类
package com.itheima.bos.utils; import java.io.IOException; import java.net.URLEncoder; import sun.misc.BASE64Encoder; public class FileUtils { /** * 下载文件时,针对不同浏览器,进行附件名的编码 * * @param filename * 下载文件名 * @param agent * 客户端浏览器 * @return 编码后的下载附件名 * @throws IOException */ public static String encodeDownloadFilename(String filename, String agent) throws IOException { if (agent.contains("Firefox")) { // 火狐浏览器 filename = "=?UTF-8?B?" + new BASE64Encoder().encode(filename.getBytes("utf-8")) + "?="; filename = filename.replaceAll("\r\n", ""); } else { // IE及其他浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+"," "); } return filename; } }