SpringMVC는 메모리에서 Excel을 직접 생성하여 사용자가 브라우저에서 직접 다운로드하여 사용할 수 있도록 합니다.

6885 단어 springMVCpoiExcel
1. 데이터베이스의 SCHEMA를 조회하는 방법, 여기에 핵심적인 SQL 문구를 붙인다
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가 되었다

좋은 웹페이지 즐겨찾기