最近遇到的一个需求是讲数据库中查到的数据导出到Excel表格文件,直接上干货。

首先,下载要使用到的jar包poi包,下载地址:http://mvnrepository.com/artifact/org.apache.poi/poi,如果你使用了maven工具,里面也有maven的配置参数,我下载的版本是3.14。

下图是导出的表格数据:

java导出sql可执行文件 java将数据库数据导出excel_java


如图所示,表格的主体部分分成了3部分并用序号标记出,表格的生成过程也是按照序号进行,表格中除了第三部分的数据是从数据库查得,其他的文件名、标题名、表名、表头内容都是自己定义的内容。从数据库查得的数据被封装在List<Map<String,String>>类型的集合中,若被封装在自定义的bean中,方法同。

步骤一:封装数据

List<Map<String, String>> result = new ArrayList<>();
Map<String, String> map = new LinkedHashMap<>();
map.put("U_ID", "...");
...
result.add(map);

使用LinkedHashMap是为了在后面遍历填充数据到表格的时候按放入数据的顺序填充。

步骤二:定义变量值,创建Excel文档对象。

String fileName = "公司员工信息表.xls";        // 定义文件名
String headString = "公司员工信息表";          // 定义表格标题
String sheetName = "工作表一";                  // 定义工作表表名
String filePath = "E:\\test\\";             // 文件本地保存路径
String[] thead = {"主键(U_ID)","状态(UDT_STATE)","姓名(U_NAME)","SAP编号(UDT_SAPID)","性别(U_SEX)","管理关系归属(UDT_ASCRIPTION)","所属公司(UDT_COMPANY)","一级部门(UDT_FIRST)","二级部门(UDT_SECOND)","职务岗位(POSSITION_ID)","厂区(UDT_PARK)","城市(CITY_NAME)"};                    // 定义表头内容
int[] sheetWidth = {2500,3500,3000,4000,2500,5000,5000,5000,5000,5000,3500,3500};   // 定义每一列宽度

HSSFWorkbook wb = new HSSFWorkbook();           // 创建Excel文档对象
HSSFSheet sheet = wb.createSheet(sheetName);    // 创建工作表

注意表头内容的数量以及定义列宽的数量都应该与封装数据的Map的长度相同。

步骤三:生成表格

表格分为了三部分,按顺序生成。基本思路是先创建行,再创建每一行中的每一格,添加样式,填入内容。

// ①创建表格标题
ExcelUtil.createHeadTittle(wb, sheet, headString, result.get(0).size() - 1);

// result.get(0).size() - 1为表格占用列数,从0开始
// ②创建表头
ExcelUtil.createThead(wb, sheet, thead, sheetWidth);
// ③填入数据
ExcelUtil.createTable(wb, sheet, result);

调用的ExcelUtil工具类代码如下:

public class ExcelUtil {

    /**
     * 创建表格标题
     * @param wb            Excel文档对象
     * @param sheet         工作表对象
     * @param headString    标题名称
     * @param col           标题占用列数
     */
    public static void createHeadTittle(HSSFWorkbook wb,HSSFSheet sheet,String headString,int col){
        HSSFRow row = sheet.createRow(0);           // 创建Excel工作表的行
        HSSFCell cell = row.createCell(0);          // 创建Excel工作表指定行的单元格
        row.setHeight((short) 1000);                // 设置高度

        cell.setCellType(HSSFCell.ENCODING_UTF_16); // 定义单元格为字符串类型
        cell.setCellValue(new HSSFRichTextString(headString));

        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, col));  // 指定标题合并区域

        // 定义单元格格式,添加单元格表样式,并添加到工作簿
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);             // 指定单元格居中对齐
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  // 指定单元格垂直居中个对齐
        cellStyle.setWrapText(true);                                    // 指定单元格自动换行

        // 设置单元格字体
        HSSFFont font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName("微软雅黑");
        font.setFontHeightInPoints((short) 16); // 字体大小

        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

    /**
     * 创建表头
     * @param wb            Excel文档对象
     * @param sheet         工作表对象
     * @param thead         表头内容
     * @param sheetWidth    每一列宽度
     */
    public static void createThead(HSSFWorkbook wb,HSSFSheet sheet,String[] thead,int[] sheetWidth){
        HSSFRow row1 = sheet.createRow(1);
        row1.setHeight((short) 600);
        // 定义单元格格式,添加单元格表样式,并添加到工作簿
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        cellStyle.setWrapText(true);
        cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  // 设置背景色
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);                // 设置右边框类型
        cellStyle.setRightBorderColor(HSSFColor.BLACK.index);               // 设置右边框颜色

        // 设置单元格字体
        HSSFFont font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 10);
        cellStyle.setFont(font);

        // 设置表头内容
        for(int i=0;i<thead.length;i++){
            HSSFCell cell1 = row1.createCell(i);
            cell1.setCellType(HSSFCell.ENCODING_UTF_16);
            cell1.setCellValue(new HSSFRichTextString(thead[i]));
            cell1.setCellStyle(cellStyle);
        }

        // 设置每一列宽度
        for(int i=0;i<sheetWidth.length;i++){
            sheet.setColumnWidth(i, sheetWidth[i]);
        }
    }

    /**
     * 填入数据
     * @param wb        // Excel文档对象
     * @param sheet     // 工作表对象
     * @param result    // 表数据
     */
    public static void createTable(HSSFWorkbook wb,HSSFSheet sheet,List<Map<String, String>> result){
        // 定义单元格格式,添加单元格表样式,并添加到工作薄
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        cellStyle.setWrapText(true);

        // 单元格字体
        HSSFFont font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 10);
        cellStyle.setFont(font);

        // 循环插入数据
        for(int i = 0; i < result.size(); i++ ){
            HSSFRow row = sheet.createRow(i+2);
            row.setHeight((short) 400); // 设置高度
            HSSFCell cell = null;
            int j = 0;
            for (String key : (result.get(i).keySet())) {
                cell = row.createCell(j);
                cell.setCellStyle(cellStyle);
                cell.setCellValue(new HSSFRichTextString(result.get(i).get(key)));
                j++;
            }
        }
    }
}

util中调用的api根据名称大概就能知道是要做什么,比如createRow创建行,createCell创建格子,想知道具体的poi的API使用方法,请移步。

步骤四:输出Excel文件到本地

FileOutputStream fos = new FileOutputStream(new File(filePath+fileName));
// filePath,fileName是如上定义的文件保存路径及文件名
wb.write(fos);

fos.close();
wb.close();