Java 导出数据到Excel中(详细代码)

前言

平时开发中,经常会用到导入导出,绝大部分是excel表格,所以开发对office的处理需要熟悉的。office的处理上我认为还是C#最好,功能最全,基本什么
功能都能实现。毕竟一家的东西,其它像java,c++,都有解决方案,下面说java如何处理的excel的。使用的是Apache POI,感觉是java处理excel中最好的。

先看结果:

在这里插入图片描述
Java实现代码

1.pom 引包

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.0.1</version>
</dependency>

2.Controller代码

@RequestMapping("export")
public void exportExcel(HttpServletResponse response) throws IOException {
    //创建一个Workbook,对应一个Excel文件
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
    try {
        // 设置请求信息
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("demo.xls", "UTF-8"));
        response.setContentType("application/force-download");

        String sheetName = "demo";
        // 在Workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet hssfSheet = hssfWorkbook.createSheet(sheetName);
        //报表总列数
        int totalColumn = 0;
        //1.先设置第二、第三行标题,获取列数
        totalColumn = setExcelSecondAndThirdTitle(hssfWorkbook, hssfSheet);
        if (totalColumn == -1) {
            return;
        }

        //2.设置第一行头部标题
        if (!setExcelTitle(hssfWorkbook, hssfSheet, totalColumn)) {
            return;
        }
        //上面是设置标题的,数据渲染大家可以根据自己的数据照着标题渲染方式进行循环塞入数据

        //输出文件,下载表格
        OutputStream outputStream = response.getOutputStream();// 打开流
        try {
            hssfWorkbook.write(outputStream);// HSSFWorkbook写入流
        } catch (Exception ex) {
            System.out.print("HSSFWorkbook写入流发生异常 " + ex.toString());
        } finally {
            outputStream.flush();// 刷新流
            outputStream.close();// 关闭流
        }
    } catch (Exception ex) {
        System.out.print("导出Excel发生异常 " + ex.toString());
    } finally {
        if (hssfWorkbook != null) {
            hssfWorkbook.close();
        }
    }
}

基本上注释都很全,不需要再说了。主要是使用 HSSFWorkbook对象创建一个excel文件,使用HSSFSheet创建一个excel的sheet,然后在调用方法去创建第一行,第二行,第三行这样,最后将文件写入到输出流,导出文件。这里由于是个demo,代码就都写在一个类中了。

3.setExcelSecondAndThirdTitle 设置第二行第三行代码

/**
* 设置表格第二、第三、第四行头部标题
*
* @param hssfWorkbook 表格对象
* @param hssfSheet    表格sheet对象
*/
private int setExcelSecondAndThirdTitle(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet) {
    int totalColumn = 5;    //总列数(实际应用中总列数为公共固定列数加上数据列数,是个动态的)
    try {
        //获取单元格样式
        HSSFCellStyle titleStyle = getExcelCellStyle(hssfWorkbook, 2);
        //设置第二、第三行数据
        for (int i = 1; i < 3; i++) {
            //创建行对象
            HSSFRow row = hssfSheet.createRow(i);
            for (int j = 0; j < 5; j++) {
                HSSFCell dataCell = row.createCell(j);
                dataCell.setCellValue("第" + (i + 1) + "行 第" + (j + 1) + "列");
                dataCell.setCellStyle(titleStyle);
                //设置列宽(这里相当于10个汉字)这个需要优化,不要每次循环都设置一遍,这里演示没还优化了
                hssfSheet.setColumnWidth(j, 20 * 256);
            }
        }
        return totalColumn;
    } catch (Exception ex) {
        System.out.print("设置表格第二和第三行头部标题异常 " + ex.toString());
        return -1;
    }
}

这里totalColumn解释下,是作为一个记录整个excel总列数的变量。最终需要用它来将头部标题进行合并单元格的,不然头部不知道从第几列合并到第几列。绝大部分导出的表格的列数都是标题行的列数,所以先将副标题的列数取出来,就可以知道整个表格的列数。getExcelCellStyle是获取样式的方法,这里是写了一个方法,单独去获取单元格样式的,不然重复代码很多。

4.setExcelTitle 设置第一行头部标题

/**
* 设置表格第一行头部标题
*
* @param hssfWorkbook 表格对象
* @param hssfSheet    表格sheet对象
* @param totalColumn  总列数
* @return
*/
private boolean setExcelTitle(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, int totalColumn) {
    boolean result = false; //设置表格第一行头部标题结果
    try {
        totalColumn -= 1;   //总列数需要减1,因为第一列从0开始
        //获取单元格样式
        HSSFCellStyle titleStyle = getExcelCellStyle(hssfWorkbook, 1);
        HSSFRow row = hssfSheet.createRow(0);
        for (int i = 0; i < totalColumn; i++) {
            HSSFCell dataCell = row.createCell(i);
            if (i == 0) {
                //标题只需要在第一列上设置值,剩下的就是合并单元格
                dataCell.setCellValue("Demo 我是标题");
                dataCell.setCellStyle(titleStyle);
            }
        }
        //设置高度
        row.setHeight((short) (200 * 3));
        //合并单元格(从第0行到第0行,从第0列到总列数,excel合并单元格都是这样,4个参数组成的坐标)
        hssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, totalColumn));
        result = true;
    } catch (Exception ex) {
        System.out.print("设置表格第一行头部标题时发生异常 " + ex.toString());
    }
    return result;
}

头部标题行主要就是合并单元格,合并单元格是excel中比较复杂的。就像坐标一样,需要准确告知sheet从哪行哪列合并到哪行哪列。如果表格都是固定的那很简单,如果是根据数据来动态合并就比较复杂了。

5.getExcelCellStyle 获取表格单元格样式方法

/**
* 获取表格单元格样式
*
* @param hssfWorkbook 表格对象
* @param type         类型 1:报表第一行头部标题单元格样式
*                     2:报表第二和第三行头部标题单元格样式
* @return
*/
private HSSFCellStyle getExcelCellStyle(HSSFWorkbook hssfWorkbook, int type) {
    //设置标题样式
    HSSFCellStyle titleStyle = hssfWorkbook.createCellStyle();
    //设置单元格对齐方式
    titleStyle.setAlignment(HorizontalAlignment.CENTER);
    titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    //设置单元格边框
    titleStyle.setBorderTop(BorderStyle.THIN);
    titleStyle.setBorderBottom(BorderStyle.THIN);
    titleStyle.setBorderLeft(BorderStyle.THIN);
    titleStyle.setBorderRight(BorderStyle.THIN);
    //设置背景颜色填充模式
    titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    //设置字体样式
    Font titleFont = hssfWorkbook.createFont();
    titleFont.setFontHeightInPoints((short) 15); // 字体高度
    titleFont.setFontName("黑体"); // 字体样式
    //判断是其它类型设置不同样式
    if (type == 1) {
        //设置前景颜色
        titleStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index);
        HSSFPalette palette = hssfWorkbook.getCustomPalette();
        //设置自定义颜色(RGB)
        palette.setColorAtIndex(IndexedColors.SEA_GREEN.index, (byte) 180, (byte) 219, (byte) 230);
    } else if (type == 2) {
        //设置前景颜色
        titleStyle.setFillForegroundColor(IndexedColors.SEA_GREEN.index);
        HSSFPalette palette = hssfWorkbook.getCustomPalette();
        palette.setColorAtIndex(IndexedColors.SEA_GREEN.index, (byte) 174, (byte) 220, (byte) 179);
        //设置字体样式
        titleFont.setFontHeightInPoints((short) 12); // 字体高度
        titleFont.setBold(true);    //字体加粗
        //titleFont.setColor(IndexedColors.RED.getIndex()); //设置字体颜色
    }
    titleStyle.setFont(titleFont);
    return titleStyle;
}

因为导出表格除了能将数据展示出来以外,美观也是一部分。所以好看的表格都是颜色协调,字体合适的,将样式提成方法,每一行在设置样式的时候来获取一次就行了,不需要每行都写一遍。上面代码基本满足绝大部分表格的样式代码,可以根据需要调整字体大小,颜色等。

最后通过浏览器访问接口就可以下载表格了
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以使用Apache POI库来操作Excel文件。以下是一个示例代码,演示如何使用POI库在Excel工作表合并单元格并导出Excel文件: ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExport { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建样式 CellStyle style = workbook.createCellStyle(); style.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 合并单元格 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0)); sheet.addMergedRegion(new CellRangeAddress(1, 2, 1, 1)); sheet.addMergedRegion(new CellRangeAddress(1, 2, 2, 2)); sheet.addMergedRegion(new CellRangeAddress(1, 2, 3, 3)); // 创建行和列 Row row0 = sheet.createRow(0); row0.createCell(0).setCellValue("合并单元格"); row0.getCell(0).setCellStyle(style); Row row1 = sheet.createRow(1); row1.createCell(0).setCellValue("AAA"); row1.getCell(0).setCellStyle(style); row1.createCell(1).setCellValue("BBB"); row1.getCell(1).setCellStyle(style); row1.createCell(2).setCellValue("CCC"); row1.getCell(2).setCellStyle(style); row1.createCell(3).setCellValue("DDD"); row1.getCell(3).setCellStyle(style); Row row2 = sheet.createRow(2); row2.createCell(1).setCellValue("XXX"); row2.getCell(1).setCellStyle(style); row2.createCell(2).setCellValue("YYY"); row2.getCell(2).setCellStyle(style); row2.createCell(3).setCellValue("ZZZ"); row2.getCell(3).setCellStyle(style); // 导出Excel文件 FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } } ``` 这个示例代码创建了一个名为"Sheet1"的Excel工作表,并在第一行合并了第一列到第四列的单元格。然后,它在第二行和第三行创建了四个单元格,并将它们合并成了一个单元格。最后,它将Excel文件导出到名为"example.xlsx"的文件。 你可以根据自己的需求更改代码来实现自定义的合并单元格导出Excel表格

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值