之前用的easyPoi 导出过程中 一直报错 因为项目比较急 索性就直接不用
**第一步 引用POM文件**
<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>
**第二步 调用两个工具类**
public class ExcelBean {
public ExcelBean ( ) {
}
public ExcelBean ( int sheetNum, String sheetTitle, String[ ] headers, List< List< String> > data) {
this . sheetNum = sheetNum;
this . sheetTitle = sheetTitle;
this . headers = headers;
this . data = data;
}
private int sheetNum;
private String sheetTitle;
private String[ ] headers;
private List< List< String> > data;
public int getSheetNum ( ) {
return sheetNum;
}
public void setSheetNum ( int sheetNum) {
this . sheetNum = sheetNum;
}
public String getSheetTitle ( ) {
return sheetTitle;
}
public void setSheetTitle ( String sheetTitle) {
this . sheetTitle = sheetTitle;
}
public String[ ] getHeaders ( ) {
return headers;
}
public void setHeaders ( String[ ] headers) {
this . headers = headers;
}
public List< List< String> > getData ( ) {
return data;
}
public void setData ( List< List< String> > data) {
this . data = data;
}
}
public class ExportExcelUtils {
public static HSSFWorkbook exportExcel ( List< ExcelBean> excelBeans) {
HSSFWorkbook workbook = new HSSFWorkbook ( ) ;
for ( ExcelBean excelBean : excelBeans) {
exportExcel ( workbook, excelBean. getSheetNum ( ) , excelBean. getSheetTitle ( ) , excelBean. getHeaders ( ) ,
excelBean. getData ( ) ) ;
}
return workbook;
}
public static HSSFWorkbook exportExcel ( ExcelBean bean) {
HSSFWorkbook workbook = new HSSFWorkbook ( ) ;
exportExcel ( workbook, 0 , bean. getSheetTitle ( ) , bean. getHeaders ( ) , bean. getData ( ) ) ;
return workbook;
}
public static void exportExcel ( HSSFWorkbook workbook, int sheetNum, String sheetTitle, String[ ] headers,
List< List< String> > result) {
HSSFSheet sheet = workbook. createSheet ( ) ;
workbook. setSheetName ( sheetNum, sheetTitle) ;
sheet. setDefaultColumnWidth ( ( short ) 20 ) ;
HSSFRow row = sheet. createRow ( 0 ) ;
for ( int i = 0 ; i < headers. length; i++ ) {
HSSFCell cell = row. createCell ( ( short ) i) ;
HSSFRichTextString text = new HSSFRichTextString ( headers[ i] ) ;
cell. setCellValue ( text. toString ( ) ) ;
}
if ( result != null) {
int index = 1 ;
for ( List< String> m : result) {
row = sheet. createRow ( index) ;
int cellIndex = 0 ;
for ( String str : m) {
HSSFCell cell = row. createCell ( ( short ) cellIndex) ;
cell. setCellValue ( str) ;
cellIndex++ ;
}
index++ ;
}
}
}
}
然后写方法 直接调用`
` /**
* 图文分析导出
*
* @param
* @param response
*/
@GetMapping("/export")
@ResponseBody
public void export() {
//articleAnalyzeParam.setUserId(AuthHelper.getUserId());
//HbnResult<List<ArticleAnalyzeDto>> list = articleRpc.listAllArticlesByParam(articleAnalyzeParam);
//模拟从数据库获取需要导出的数据
//模拟从数据库获取需要导出的数据
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request= servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();
List<Person> personList = new ArrayList<>();
Person person1 = new Person("路飞","1",new Date());
Person person2 = new Person("娜美","2", new Date());
Person person3 = new Person("索隆","1",new Date());
Person person4 = new Person("小狸猫","1",new Date());
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
String[] headers = { "姓名", "性别", "时间"};
ExcelBean bean = new ExcelBean();
bean.setHeaders(headers);
bean.setSheetNum(0);
bean.setSheetTitle("海贼王");
List<List<String>> data = new LinkedList<>();
Iterator iterator = personList.iterator();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
while (iterator.hasNext()) {
List<String> temp = new LinkedList<>();
Person next = (Person) iterator.next();
//temp.add(next.getName()); // 其实这个意义不大的
if (next.getName() != null) {
temp.add(next.getName().toString());
}
if (next.getSex() != null) {
temp.add(next.getSex().toString());
}
if (next.getBirthday() != null) {
temp.add(next.getBirthday().toString());
}
data.add(temp);
}
bean.setData(data);
try {
buildExcelDocument(bean.getSheetTitle(), response, bean);
} catch (Exception e) {
//log.error(e.getMessage());
System.out.println("error");
}
}
protected void buildExcelDocument ( String filename, HttpServletResponse response, ExcelBean bean)
throws IOException {
response. setHeader ( "Content-Disposition" ,
"attachment;filename=\"" + new String ( ( filename) . getBytes ( "gb2312" ) , "ISO8859-1" ) + ".xls" + "\"" ) ;
HSSFWorkbook hssfWorkbook = ExportExcelUtils. exportExcel ( bean) ;
hssfWorkbook. write ( response. getOutputStream ( ) ) ;
}
返回浏览器下载
之前传的参数直接是 HttpServletResponse 出现一个问题 好像是和JSP内置对象 冲突 一直报
**java.lang.IllegalStateException: getOutputStream() has already been called for this response**
后来找到解决方法 直接在代码里调用HttpServletResponse 就可以了
很简单的一个SpringBoot+POI 导出实现 可以根据自己的业务逻辑去改一下直接就能用
分享技术 分享生活