之前导出excel大量重复代码,自己输入excel表头,一行一行写入太麻烦了。最新发现只要配置查询的sql语句,其他代码无需改动。废话不说了,贴代码。
注:使用原生的jdbc查询。
Workbook wb = new SXSSFWorkbook(100);// 声明一个工作薄
CellStyle style = wb.createCellStyle(); // 一个样式
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //设置垂直居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中
Font headerFont = wb.createFont(); //创建字体样式
headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
headerFont.setFontName("Times New Roman"); //设置字体类型
headerFont.setFontHeightInPoints((short) 8); //设置字体大小
style.setFont(headerFont); //为标题样式设置字体样式
/* style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
*/
style.setWrapText(true);
Sheet sheet = wb.createSheet(sheetName);//声明工作薄里中一个工作表的名字
sheet.setDefaultColumnWidth(20);//给工作一个默认长度
Row row = sheet.createRow(0); //创建第一行(也可以称为表头)
//通过传过来的sql获得数据
RowSet rowSet = //执行原生sql,是为了获得列的信息ResultSetMetaData。
ResultSetMetaData columnNames = rowSet.getMetaData();
int columnValues = columnNames.getColumnCount();
for(int i=0;i<columnValues;i++){
Cell cell = row.createCell(i);
cell.setCellStyle(style);
cell.setCellValue(columnNames.getColumnName(i+1));
}
int rowNo=1;
/* HSSFFont contextFont = (HSSFFont) wb.createFont(); //创建字体样式
contextFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//字体加粗
style.setFont(contextFont);*/
while(rowSet.next()) {
row = sheet.createRow(rowNo);
for(int columnNo=0;columnNo<columnValues;columnNo++){
Cell cell = row.createCell(columnNo);
// cell.setCellStyle(style);
Object columnValue = rowSet.getObject(columnNo+1);
if(columnValue==null){
continue;
}
if(columnValue instanceof String){
cell.setCellValue(rowSet.getString(columnNo+1));
}else if(columnValue instanceof Integer){
cell.setCellValue(rowSet.getInt(columnNo+1));
}else if(columnValue instanceof Double){
cell.setCellValue(rowSet.getDouble(columnNo+1));
}else if(columnValue instanceof Date){
cell.setCellValue(DateUtils.Date2String(rowSet.getDate(columnNo+1), "yyyy-MM-dd"));
}else if(columnValue instanceof TIMESTAMP){
cell.setCellValue(rowSet.getTimestamp(columnNo+1));
}else if(columnValue instanceof BigDecimal){
cell.setCellValue(rowSet.getBigDecimal(columnNo+1).doubleValue());
}
}
rowNo++;
}
File dstFile = File.createTempFile(String.valueOf(System.currentTimeMillis()), ".xlsx");
dstFile.deleteOnExit();//程序退出时删除文件
OutputStream output=new FileOutputStream(dstFile);
wb.write(output);//写入文件
output.flush();
output.close();//关闭流