1.POI导入
1.首先从页面获取文件(strust2框架)
//定义一个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文件
//先在内存中创建一个excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
3.与导入xls相反,创建sheet标签页和row行
//创建标签页
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;
}
}