SpringMVC는 메모리에서 Excel을 직접 생성하여 사용자가 브라우저에서 직접 다운로드하여 사용할 수 있도록 합니다.
SELECT COLUMN_NAME AS field, COLUMN_COMMENT AS comment
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ?
주석이 어떤 것은 매우 길기 때문에 모두 excel의 한 칸으로 꺼내면 매우 좋지 않다. 사실 우리는 단지 중요한 뜻이 필요할 뿐이다. 그러므로 이곳의 전제 조건은 주석을 구분자로 분리하는 것이다
예를 들어name=> 이름: 사용자 닉네임, 여기서':'로 분할하고'이름'만 꺼낼 수 있습니다.그래서 편리한 일은 많은 약속이 필요하다. 특히 팀워크가 필요하다.
표의 필드 이름과 주석을 얻기 위해 공용 클래스를 추출했습니다.
/**
* Created with antnest-platform
* User: Vernon.Chen
* Date: 2015/3/16
* Time: 17:03
*/
@Service
public class QuerySchema {
@Resource
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> getSchemaByTableName(String tableName) {
if (StringUtils.isBlank(tableName)) {
return null;
}
List<Map<String, Object>> schema = new ArrayList<Map<String, Object>>();
StringBuilder sqlSB = new StringBuilder();
sqlSB.append(" SELECT COLUMN_NAME AS field, COLUMN_COMMENT AS comment ");
sqlSB.append(" FROM INFORMATION_SCHEMA.COLUMNS ");
sqlSB.append(" WHERE table_name = ? ");
schema = jdbcTemplate.queryForList(sqlSB.toString(), new Object[]{tableName});
if (schema != null && schema.size() > 0) {
for (Map<String, Object> map : schema) {
String comment = (String) map.get("comment");
if (StringUtils.isNotBlank(comment) && comment.indexOf(":") > -1) {
map.put("comment", comment.substring(0, comment.indexOf(":")));
}
}
}
return schema;
}
}
이 반환 결과는 목록입니다. 모든 맵은 {"field": "XXX", "comment": "XXX"}입니다.
다음은 Excel을 생성하는 방법입니다.비교적 중요한 단계이기도 하다.Excel을 생성합니다. 제가 알기로jar 패키지는 2개입니다. 하나는 jxl입니다.jar, 또 하나는 프로젝트에 사용된poi입니다.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
여기 제 버전은:
<poi.version>3.10-FINAL</poi.version>
그리고 엑셀을 조립하는 코드를 켜보세요.생성된 파일을 로컬로 영구화할 필요가 없기 때문에byte[]로 되돌아가면 됩니다.
@Override
public byte[] selectExcel() throws Exception {
ByteArrayOutputStream out = null;
try {
HSSFWorkbook workbook = new HSSFWorkbook();
generateExcelForAs(cellMapper.selectExcel(), workbook);
out = new ByteArrayOutputStream();
HSSFWorkbook hssWb = (HSSFWorkbook) workbook;
hssWb.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return out.toByteArray();
}
각 행 반복 생성
private void generateExcelForAs(List<Map<String, Object>> list, HSSFWorkbook workbook) {
if (list == null || list.size() == 0) {
return ;
}
List<Map<String, Object>> title = querySchema.getSchemaByTableName("t_cell");
int excelRow = 0;
try {
HSSFSheet sheet = workbook.createSheet();
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
Map<String, Object> first = list.get(0);
//
int column = 0;
HSSFRow row = sheet.createRow(excelRow);
for (Map<String, Object> map : title) {
row.createCell(column).setCellValue(map.get("comment").toString());
column++;
}
excelRow++;
column = 0;
// 1 , 0
row = sheet.createRow(excelRow);
for (Map<String, Object> map : title) {
if (!first.containsKey(map.get("field"))) {
column++;
} else {
String value = first.get(map.get("field")) == null ? "" : first.get(map.get("field")).toString();
row.createCell(column).setCellValue(value);
column++;
}
}
excelRow++;
} else {
HSSFRow row = sheet.createRow(excelRow);
Map<String, Object> rowMap = list.get(i);
int column = 0;
for (Map<String, Object> map : title) {
if (!rowMap.containsKey(map.get("field"))) {
column++;
} else {
String value = rowMap.get(map.get("field")) == null ? "" : rowMap.get(map.get("field")).toString();
row.createCell(column).setCellValue(value);
column++;
}
}
excelRow++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
코드가 비교적 좌절되고 효율도 낮아서 어쩔 수 없다. 왜냐하면 지정된 순서에 따라 생성해야 하기 때문이다.아마도 더 좋은 방법이 있을 것이다. 나는 지금 단지 제때에 수요를 완성해야 할 뿐이다.
여기가 원하는 바이트로 돌아왔습니다.
마지막 단계는 Response에서 흐름을 되돌리는 것입니다.
@RequestMapping(value = "/xxx")
public void cell(HttpServletResponse response) throws Exception {
byte[] bytes = cellService.selectExcel();
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename=" + UUIDUtil.getUUID() + ".xls");
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
response.getOutputStream().close();
}
여기서 주의하는 것은 다음과 같다.
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename=" + UUIDUtil.getUUID() + ".xls");
하나는 브라우저에서 다운로드해야 한다는 것을 알려주고 다음은 프로세서에서 다운로드한 파일의 이름을 알려주는 것이다.여기 내가 쓰는 UUID. 이로써 완전히 OK가 되었다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Spring MVC] [1] 5. 스프링 MVC - 구조 이해핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회 핸들러 어댑터 실행: 핸들러 어댑터를 실행 핸들러 매핑 org.sp...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.