java 백그라운드 생성 excel, 프론트 데스크톱 요청 다운로드
4381 단어 작은 기능
내가 사용하는 ssm+maven, excel을 조작하는 가방은poi-ooxml
maven 좌표는 다음과 같습니다.
org.apache.poi
poi-ooxml
3.9
원리는 다음과 같다.
프론트 데스크톱에서 백엔드로 요청을 보내고 컨트롤러가 수신한 후에 excel 파일을 생성하는 논리를 호출합니다. 이때 excel 파일은 메모리에 있습니다.
이 파일의 작업이 출력 흐름에 지정된 주소인 경우(예:
OutputStream out = new FileOutputStream("E:/Members.xls");
로컬 e판에 저장되었습니다.출력 흐름은 new에서 나온 것이기 때문에 브라우저와 아무런 관계가 없습니다. 만약에 이 출력 흐름의 출처가 브라우저와 관계가 있다면 연극이 있지 않겠습니까?
controller가 수신한 요청은 자동으로 매개 변수인 HttpServletResponse가 있고 출력 흐름을 가져올 수 있는 방법이 있습니다.
response.getOutputStream();
그리고 response는 브라우저에 이 응답은 excel 파일을 다운로드하는 것이라고 알려주기 때문에 다음과 같이 설정해야 합니다. response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=utf-8");// contentType excel
response.setHeader("Content-Disposition", "Attachment;Filename="+ fileName+".xls");
그 중의 fileName은 자신이 정의한 것입니다. 뒤에 있는 전체 코드에 무엇이 있습니다.마지막으로
가장 중요한 단계는 이전에 많은 문장을 보았지만 이 단계를 보지 못했기 때문에 어떻게 해도 성공하지 못했다.
사실은 매우 간단하다. 이 단계까지 excel 파일은response나 출력 흐름과 아무런 관계가 없기 때문에 이런 관계를 만들어야 한다. 다음과 같다.
workbook.write(fos);
그 중에서workboo는 excel을 조작하는 클래스이고fos는 바로 가져온 출력 흐름이다.이렇게 하면 돼.전체 코드:
@RequestMapping("info")
public void info(HttpServletRequest request, HttpServletResponse response){
Map map = new HashMap();
map.put("sequence", "0001");
map.put("date", "2018/01/04");
map.put("chetaihao", "1#");
map.put("productName", " ");
map.put("specification", " ");
map.put("memo", " ");
map.put("inspectRecordBizList", " list");
HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet(" ");
Row row = sheet.createRow(0);
int i = 0;
for(String key : map.keySet()){
Cell cell = row.createCell(i);
cell.setCellValue((String) map.get(key));
i++;
}
OutputStream fos = null;
try {
fos = response.getOutputStream();
String userAgent = request.getHeader("USER-AGENT");
String fileName = "test";
try {
if(StringUtils.contains(userAgent, "Mozilla")){
fileName = new String(fileName.getBytes(), "ISO8859-1");
}else {
fileName = URLEncoder.encode(fileName, "utf8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=utf-8");// contentType excel
response.setHeader("Content-Disposition", "Attachment;Filename="+ fileName+".xls");
wb.write(fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
첫째,
맵은 데이터를 저장합니다. 사용하기 싫으면 뒤에 있는 for에 셀의 값을 수동으로 추가합니다.맵의 데이터 출처는 현재와 같이 직접 추가할 수도 있고 데이터베이스에서 찾을 수도 있다.그것은 단지 데이터를 저장할 뿐,list나 다른 것을 사용해도 되고, 칸에 값을 저장할 때 대응하는 데이터가 있으면 된다.
둘째,
fileName은 이렇게 정의하거나 업무 요구에 따라 정의합니다.try-catch의 처리는 서로 다른 브라우저를 대상으로 합니다. 그렇지 않으면 파일 이름이 엉망이 될 수 있습니다
셋째,
response의 몇 가지 설정은 브라우저에 이 응답은 다운로드 방식으로 보여야 한다고 말했습니다.
넷째,
워크북 쓰기 출력 흐름
다섯째,
excel 작업.
마지막으로 이것은 excel을 조작하면 단독으로 한 장이 될 수 있기 때문에 간단하게 설명합니다.excel 파일의 출처는 이미 존재하는 파일로 흐름을 통해 읽을 수 있습니다.새로 만들 수도 있습니다.excel 파일을 조작하는 것은 sheet (작업표) 를 만들거나 가져오고, row (몇 줄) 를 만들거나,cell (셀) 을 셀에 set 값이나 get 값으로 가져오면 됩니다.그중에 칸과 칸을 합치는 스타일과 관련된 것은 내가 쓰지 않았고 자료가 매우 많다.
인터넷의 많은 자료용 데이터 유형, 예를 들어List>은 사실 맵과 마찬가지로 모두 데이터를 저장하고 그들의 데이터 출처는 데이터베이스일 수 있다.그리고 그들의 업무 논리와 관련된 excel표를 직접 만들었기 때문에 처음에는 이해하지 못했다.나는 지금 이것은 단지 표두를 만들었을 뿐이다. 왜냐하면 주요 기능은 프론트에서 보낸 요청을 실현하여 백엔드의 excel 파일을 다운로드하는 것이기 때문에 다운로드할 수 있는 것이 내가 원하는 것이다.생성된 excel표는 어떤 것을 더 추가해야 합니까?
참, 프론트 데스크의 요청은 버튼으로 이벤트를 연결합니다. 그리고
location.href = "xxx"에서 보낸 요청
마지막으로 내가 알아낼 수 있었던 것은 이 블로그를 참고했기 때문이다.
http://blog.csdn.net/u014621859/article/details/54944059
LG