Maven整合SSM 框架,POI插件导出EXCEL文件
Maven+SSM+poi导出Excel文件
片头
背景描述
最近被提出需求,要求网站实现对数据库的数据进行查询,并要求可实现导出这些。没办法,有新要求只能乖乖去实现呗。于是上网搜解决办法,经过一系列操作,最终算是实现了需求。
环境
Maven整合SSM框架+poi
正片
1part
maven配置文件pom.xml依赖上
<!--excel解析poi包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2part
web前端可设置直接打开新窗口,访问网址即可
window.open(url + export/exportExcel?ExcelName=“马品种常量表”)
3part(主要)
controller层
@Controller
@RequestMapping("/export")
public class ExportController{
@Autowired
private ExportService exportService;
@RequestMapping(value = "/exportExcel", produces = "application/json; charset=utf-8")
@ResponseBody
public Map<String, Object> exportExcel(String ExcelName,HttpServletResponse response) throws IOException {
//文件名用
String fileName = "";
String fileNameURL = "";
// 创建excel工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个工作表sheet
HSSFSheet sheet = workbook.createSheet();
// 创建第一行
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null;
/**
* 1.马品种常量表
*/
if(ExcelName.equals("马品种常量表")){
// 创建一个文件(有中文必须URL编码)
fileName = ExcelName + ".xls";//创建文件名(改)
fileNameURL = URLEncoder.encode(fileName, "UTF-8");
System.out.println(fileName);
//获取数据(查出想要导出的数据)
List<HorseBreedConstant> lists = exportService.getHorseBreedConstant();
String[] title = { "序号","马品种名" };//设置EXCEL的第一行的标题头(改)
// 插入第一行,标题头
for (int i = 0; i < title.length; i++) {
// 创建一行的一格
cell = row.createCell(i);
// 赋值
cell.setCellValue(title[i]);
}
if(lists.size() != 0){
// 追加数据行数
int j = 1;
HorseBreedConstant list = null;
for (int i = 0; i < lists.size(); i++) {
// 从集合中得到一个对象
list = lists.get(i);
// 创建第2行(数据)
HSSFRow nextrow = sheet.createRow(i+1);
// 创建第2行第1列并赋值
HSSFCell cessk = nextrow.createCell(0);
cessk.setCellValue(list.getHorse_breed_id());//改
// 创建第2行第2列并赋值
cessk = nextrow.createCell(1);
cessk.setCellValue(list.getHorse_breed());//改
/*
cessk = nextrow.createCell(2);
cessk.setCellValue(Integer.parseInt(new java.text.DecimalFormat("0").format(list.get("upload"))));//改
*/
j++;
}
System.out.println(j+"条数据");
}
}
if (fileName.equals("")) {
response.getWriter().write("失败,失败原因:参数为空!");
workbook.close();
return ResponseData.error("失败,失败原因:参数错误!");
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename="+fileNameURL+";"+"filename*=utf-8''"+fileNameURL);
OutputStream ouputStream;
try {
ouputStream = response.getOutputStream();
workbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
return ResponseData.success("ok");
} catch (IOException e) {
return ResponseData.error("catch");
} finally{
workbook.close();
}
4part
service
@Service
@Transactional
public class ExportServiceImpl implements ExportService{
@Autowired
private ExportMapper exportMapper;
@Override
public List<HorseBreedConstant> getHorseBreedConstant(){
//返回查询结果
return exportMapper.getHorseBreedConstant();
}
}
5part
mapper.xml
<select id="getHorseBreedConstant" resultType="xxx">
SELECT * FROM horse_breed_constant
</select>
结果
火狐浏览器测试(文件名中文乱码问题)
导出的excel
片尾
主要部分是在获取lists后,处理lists为想要打印的数据。
//获取数据
List<SemenTransportBackCustom> lists = zinSummaryMapper.getMaleYearStation(semenTransportBackCustom);
//循环插入序号
for (int i = 0; i < lists.size(); i++) {
//序号
lists.get(i).setId(i+1);
}
带查询的话,访问地址进行字符串拼接,带参数。mapper.xml加语句即可,使数据为筛选后的。
花絮
xls和xlsx
fileName = ExcelName + ".xlsx";//创建文件名(改)
xlsx后缀名出错
xls是Excel1997-2003的格式,xlsx是Excel 2007之后版本创建的格式。 两种版本在保存时编码不一样。改成xls就好了
导出文件名乱码
日期转化文字符串输出
// 日期格式转为字符串输出
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
cessk = nextrow.createCell(4);
cessk.setCellValue(dateFormat.format(list.getMating_date()));
调整列宽
for (int i = 0; i < title.length; i++) {
sheet.setColumnWidth(i, title[i].getBytes().length*1*256+1000);//(中文适用)
//sheet.autoSizeColumn(i); 自适应宽度
}
加批注
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);// 创建一行的一格
cell.setCellValue(title[i]);// 赋值
if(i==2){
//1.得到一个POI的工具类
CreationHelper factory = workbook.getCreationHelper();
//2.得到一个换图的对象
Drawing<?> drawing = sheet.createDrawingPatriarch();
//3.对这个单元格加上注解
Comment comment0 = drawing.createCellComment(new HSSFClientAnchor(0,0,0,0,(short)3,3,(short)5,6)); //设置批注框位置
RichTextString str0 = factory.createRichTextString("'-1'表示芯片号为空");
comment0.setString(str0);
comment0.setAuthor("administrator");
cell.setCellComment(comment0);
}
}