`
ear
  • 浏览: 2640 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

批量导出Excel(.xlsx格式)

阅读更多
直接上代码:
poi版本大于3.8
public class ExcelUtil {
    //声明一个模板工作薄(写入流式数据)
    private Workbook writeDataWorkBook;
    //样式列表
    private Map<String, CellStyle> cellStyleMap;
    //Excel当前数据行数(将要写入数据的索引数)
    private int currentRowNum = 0;
    //数据输出流
    private OutputStream outputStream;
    /**
     * 释放资源
     */
    public void dispose() {
        try {
            if (writeDataWorkBook != null) {
                writeDataWorkBook.write(outputStream);
            }
            if (outputStream != null) {
                outputStream.flush();
                outputStream.close();
            }
            if (cellStyleMap != null) {
                cellStyleMap.clear();
            }
            cellStyleMap = null;
            outputStream = null;
            writeDataWorkBook = null;
        } catch (IOException e) {
        }
    }

    /**
     * 导出字符串数据
     *
     * @param file        文件名
     * @param columnNames 表头
     * @param sheetTitle  sheet页Title
     */
    public void exportExcelTitle(HttpServletResponse response, String sheetName, List<String> columnNames,
                                  String sheetTitle, List<List<Object>> objects)  {
    //创建xlsx格式的Excel
        XSSFWorkbook wb = new XSSFWorkbook();
        /**
         * SXSSFWorkbook被写入的表格,可进行海量写入
         * 参数:
         * @wb2007版本Excel
         * @100批量写入条数
         */
        SXSSFWorkbook tplWorkBook = new SXSSFWorkbook(wb, 100);
        Map<String, CellStyle> cellStyleMap = styleMap(tplWorkBook);
        // 表头样式
        CellStyle headStyle = cellStyleMap.get("head");
        // 生成一个表格
        Sheet sheet = tplWorkBook.getSheet(sheetName);
        if (sheet == null) {
            sheet = tplWorkBook.createSheet(sheetName);
        }
        // 合并单元格
        sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum, 0, columnNames.size() - 1));
        // 产生表格标题行
        Row rowMerged = sheet.createRow(currentRowNum);
        Cell mergedCell = rowMerged.createCell(0);
        mergedCell.setCellStyle(headStyle);
        mergedCell.setCellValue(new XSSFRichTextString(sheetTitle));
        //写入成功一行数据递增行数
        currentRowNum = currentRowNum + 1;
        // 产生表格表头列标题行
        Row row = sheet.createRow(currentRowNum);
        for (int i = 0; i < columnNames.size(); i++) {
            Cell cell = row.createCell(i);
            cell.setCellStyle(headStyle);
            RichTextString text = new XSSFRichTextString(columnNames.get(i));
            cell.setCellValue(text);
        }
        //写入成功一行数据递增行数
        currentRowNum = currentRowNum + 1;
        //内容样式
        CellStyle contentStyle = cellStyleMap.get("content");
        //正文整数样式
        CellStyle contentIntegerStyle = cellStyleMap.get("integer");
        //正文带小数整数样式
        CellStyle contentDoubleStyle = cellStyleMap.get("double");
        for (List<Object> dataRow : objects) {
            Row row1 = sheet.createRow(currentRowNum);
            for (int j = 0; j < dataRow.size(); j++) {
                Cell contentCell = row1.createCell(j);
               
                Object dataObject = dataRow.get(j);
                contentCell.setCellStyle(contentStyle);
                String str = dataObject.toString();
                if(str.contains("-") && str.contains(":") && str.contains(".0")){
                str.trim();
                str = str.substring(0, str.lastIndexOf(" "));
                contentCell.setCellStyle(contentStyle);
                contentCell.setCellValue(str);
                }else if(this.isNum(str)){
                if(str.contains(".")){
                contentCell.setCellStyle(contentDoubleStyle);
                contentCell.setCellValue(Double.parseDouble(str));
                }else{
                contentCell.setCellStyle(contentIntegerStyle);
                contentCell.setCellValue(Integer.parseInt(str));
                }
                }else{
                contentCell.setCellStyle(contentStyle);
                contentCell.setCellValue(str);
                }
               
            }
            //写入成功一行数据递增行数
            currentRowNum = currentRowNum + 1;
        }
        for(int i = 0 ; i<columnNames.size() ; i ++){
        sheet.autoSizeColumn((short)i); //调整宽度
        }
        try {
        this.setResponseHeader(response, sheetName);
        OutputStream ops = response.getOutputStream();
            tplWorkBook.write(ops);
            ops.flush();
            ops.close();
        } catch (IOException e) {
        }
    }
   
    public void exportExcelCompare(HttpServletResponse response, String sheetName, List<String> columnNames,
            String sheetTitle, List<List<Object>> objects,int length)  {
Workbook tplWorkBook = new XSSFWorkbook();
Map<String, CellStyle> cellStyleMap = styleMap(tplWorkBook);
// 表头样式
CellStyle headStyle = cellStyleMap.get("head");
CellStyle contentStyle = cellStyleMap.get("content");
// 生成一个表格
Sheet sheet = tplWorkBook.getSheet(sheetName);
if (sheet == null) {
sheet = tplWorkBook.createSheet(sheetName);
}
// 合并单元格
sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum, 0, columnNames.size() - 1));
// 产生表格标题行
Row rowMerged = sheet.createRow(currentRowNum);
Cell mergedCell = rowMerged.createCell(0);
mergedCell.setCellStyle(headStyle);
mergedCell.setCellValue(new XSSFRichTextString(sheetTitle));
//写入成功一行数据递增行数
currentRowNum = currentRowNum + 1;
// 产生表格表头列标题行
Row row = sheet.createRow(currentRowNum);
sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum, 0,length));
sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum, length+1,length*2+1));
Cell headerCell = row.createCell(0);
headerCell.setCellStyle(contentStyle);
headerCell.setCellValue("民航局");
Cell headerCells = row.createCell(8);
headerCells.setCellStyle(contentStyle);
headerCells.setCellValue("空管局");
//写入成功一行数据递增行数
currentRowNum = currentRowNum + 1;
//正文整数样式
CellStyle contentIntegerStyle = cellStyleMap.get("integer");
//正文带小数整数样式
CellStyle contentDoubleStyle = cellStyleMap.get("double");
for (List<Object> dataRow : objects) {
Row row1 = sheet.createRow(currentRowNum);
for (int j = 0; j < dataRow.size(); j++) {
Cell contentCell = row1.createCell(j);
Object dataObject = dataRow.get(j);
contentCell.setCellStyle(contentStyle);
String str = dataObject.toString();
if(str.contains("-") && str.contains(":") && str.contains(".0")){
str.trim();
str = str.substring(0, str.lastIndexOf(" "));
contentCell.setCellStyle(contentStyle);
contentCell.setCellValue(str);
}else if(this.isNum(str)){
if(str.contains(".")){
contentCell.setCellStyle(contentDoubleStyle);
contentCell.setCellValue(Double.parseDouble(str));
}else{
contentCell.setCellStyle(contentIntegerStyle);
contentCell.setCellValue(Integer.parseInt(str));
}
}else{
contentCell.setCellStyle(contentStyle);
contentCell.setCellValue(str);
}

}
//写入成功一行数据递增行数
currentRowNum = currentRowNum + 1;
}
for(int i = 0 ; i<columnNames.size() ; i ++){
sheet.autoSizeColumn((short)i); //调整宽度
}
try {
this.setResponseHeader(response, sheetName);
OutputStream ops = response.getOutputStream();
tplWorkBook.write(ops);
ops.flush();
ops.close();
} catch (IOException e) {
}
}
   
   

    /**
     * 设置响应头
     * @param response
     * @param fileName
     */
    public void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
             fileName = new String(fileName.getBytes(),"ISO8859-1");
             response.setContentType("application/octet-stream;charset=ISO8859-1");
             response.setHeader("Content-Disposition", "attachment;filename="+ fileName+".xlsx");
             response.addHeader("Pargam", "no-cache");
             response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
             ex.printStackTrace();
        }
   }
    /**
     * 判断是否是数值型数据
     */
    public boolean isNum(String str) {
 
        try {
            new BigDecimal(str);
            if(str.contains("E")){
            return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * 单元格样式(Integer)列表
     */
    private CellStyle createCellContent4IntegerStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置边框样式
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
        //设置对齐样式
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 生成字体
        Font font = workbook.createFont();
        // 正文样式
        style.setFillPattern(XSSFCellStyle.NO_FILL);
        style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style.setFont(font);
        style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));//数据格式只显示整数
        return style;
    }

    /**
     * 单元格样式(Double)列表
     */
    private CellStyle createCellContent4DoubleStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置边框样式
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
        //设置对齐样式
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 生成字体
        Font font = workbook.createFont();
        // 正文样式
        style.setFillPattern(XSSFCellStyle.NO_FILL);
        style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style.setFont(font);
        style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));//保留两位小数点
        return style;
    }
    /**
     * 创建单元格表头样式
     *
     * @param workbook 工作薄
     */
    private CellStyle createCellHeadStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置边框样式
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
        //设置对齐样式
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 生成字体
        Font font = workbook.createFont();
        // 表头样式
        style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        style.setFont(font);
        return style;
    }

    /**
     * 创建单元格正文样式
     *
     * @param workbook 工作薄
     */
    private CellStyle createCellContentStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置边框样式
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
        //设置对齐样式
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 生成字体
        Font font = workbook.createFont();
        // 正文样式
        style.setFillPattern(XSSFCellStyle.NO_FILL);
        style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style.setFont(font);
        return style;
    }
    /**
     * 单元格样式列表
     */
    private Map<String, CellStyle> styleMap(Workbook workbook) {
        Map<String, CellStyle> styleMap = new LinkedHashMap<String, CellStyle>();
        styleMap.put("head", createCellHeadStyle(workbook));
        styleMap.put("content", createCellContentStyle(workbook));
        styleMap.put("integer", createCellContent4IntegerStyle(workbook));
        styleMap.put("double", createCellContent4DoubleStyle(workbook));
        return styleMap;
    }
}
分享到:
评论

相关推荐

    C# 导出excel表格(xls、xlsx两种格式)

    在C#编程环境中,导出Excel表格是一项常见的需求,尤其在数据处理和报告生成时。本文将详细讲解如何使用C#来实现Excel表格的导出,包括xls和xlsx两种常见格式。 首先,我们需要理解这两种格式的区别。Xls是Excel...

    C#实现从数据库数据批量导出Excel.zip

    这个压缩包"**C#实现从数据库数据批量导出Excel.zip**"提供了三种不同的实现方式,每个文件夹代表了一种方法。下面我们将详细探讨这些方法及其背后的原理和技术。 1. **使用EPPlus库** EPPlus是C#中非常流行的用于...

    批量导出excel、csv批量导出excel、csv

    在IT领域,批量导出Excel和CSV文件是一项常见的任务,特别是在数据分析、数据处理或报告生成等场景中。Excel和CSV都是广泛使用的数据格式,各有其特点和用途。 Excel(.xlsx)是Microsoft Office中的电子表格应用...

    Access批量转Excel(支持WIN11)

    导出文件的格式为.xlsx,这是Excel 2007及以后版本使用的文件格式,它支持更多的公式、图表类型和数据处理功能。与旧的.xls格式相比,.xlsx格式在存储大量数据时能更好地保持文件的大小和性能。 工具还提供了两种...

    ASP.NET-[其他类别]数据导入与数据导出Excel.zip

    总的来说,ASP.NET中数据导入与导出Excel涉及的关键技术包括:使用OLEDB或Open XML读写Excel文件,使用DataTable作为中间数据容器,以及使用DataSet进行数据操作。了解并熟练运用这些技术,能够帮助开发者高效地处理...

    php 批量导出excel实例

    安装完成后,我们可以开始编写代码来批量导出Excel。在ThinkPHP5.0中,我们通常会在控制器中处理这个逻辑。以下是一个简单的示例: ```php namespace app\controller; use PhpOffice\PhpSpreadsheet\Spreadsheet;...

    tableExport_html表格导出excel等多种格式

    "tableExport_html表格导出excel等多种格式"是一个便捷的工具,它允许用户将HTML表格的数据轻松地导出为Excel、CSV、PDF等格式。这个工具通过引入一个JavaScript库,大大简化了这个过程,使得网页开发者和非技术人员...

    Java POI根据模板生成Excel(xlsx)文件

    Java POI库是一个广泛使用的开源项目,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx文件。在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对...

    基于Python实现SQL SEVER与Excel间数据的批量导出.pdf

    XlsxWriter是一个用于将数据写入Excel 2007+ XLSX文件的Python模块,它支持创建和写入XLSX文件,同时提供了一系列用于设置Excel文件格式化的功能。通过XlsxWriter,用户可以灵活地设置Excel中的单元格格式,包括字体...

    JTable数据导出到Excel.rar

    Apache POI是Java库,用于读写Microsoft Office格式的文件,包括Excel(`.xls`和`.xlsx`)。在这个示例中,我们可能使用了`HSSFWorkbook`(用于`.xls`)或`XSSFWorkbook`(用于`.xlsx`)来创建和操作Excel工作簿。 ...

    NativeExcel.v.3.9.7.D4.XE7.rar

    6. 导出数据到Excel,用于数据分析或报告生成。 7. 进行数据排序和过滤。 尽管NativeExcel在处理.xlsx图片方面存在局限,但它的核心功能——无Office环境下的Excel操作,已经足够满足大多数业务需求。对于需要处理...

    excel.rar excel.rarexcel.rar

    6. Excel模板:在某些场景下,layui可能结合Excel模板技术,用于批量生成报告或自定义格式的数据输出,这涉及到动态填充Excel模板的能力。 7. 数据可视化:layui可以与ECharts或其他图表库结合,将Excel中的数据...

    microsoft.office.interop.excel.dll各种版本

    可以考虑使用异步操作,或者利用内存中数据结构批量处理,减少与Excel的交互次数。另外,使用完Excel对象后,记得正确释放资源,防止进程泄漏。 标签中的“read write”表示这个库主要用于读取和写入Excel文件。C#...

    c#批量导出excel

    ### C# 批量导出到 Excel 的多个 Sheet 页 在现代企业级应用开发中,数据导出是一项常见的需求,特别是在数据报表处理方面。本文将详细介绍如何使用 C# 实现将数据批量导出到 Excel 文件中的多个 Sheet 页。 #### ...

    如何将excel.xslx表格数据导出成Visual Fox(VF)表.zip

    步骤二:导出Excel数据 1. 打开Excel文件,选择包含数据的工作表。 2. 菜单栏中点击“文件”&gt;“保存为”,在弹出窗口中选择保存类型为“文本(逗号分隔)(*.csv)”或“文本(制表符分隔)(*.txt)”。 3. 选择合适的...

    winform导出excel高效,设置格式

    本文将详细讲解如何实现高效地导出Excel,并设置格式和样式,以满足自定义查询的需求。 首先,我们需要理解Excel导出的核心技术。在.NET环境中,常用的库有Microsoft.Office.Interop.Excel,它允许我们直接操作...

    Excel数据批量导入与Excel文件的导出

    导出Excel文件主要是为了保存或分享数据,或与其他应用程序兼容。主要的导出方式有: 1. **另存为**:最基础的方式是使用“文件”菜单的“另存为”选项,可以选择不同的文件格式,如Excel工作簿(.xlsx)、PDF、...

    java读取execl(xls,xlsx)

    例如,可以使用Java程序从Excel文件中读取用户数据,然后批量插入数据库,或者将数据库查询结果导出到Excel文件,便于用户查看和分析。 通过以上介绍,你应该了解了如何使用Java读取.xls和.xlsx文件的基本方法,...

    .net导入导出Excel

    在.NET框架中,导入和导出Excel是一种常见的需求,尤其在Web应用如ASP.NET中,以便用户能够方便地处理数据。本文将详细讲解如何在ASP.NET中实现Excel的导入和导出功能,以及相关的技术要点。 一、Excel与.NET交互的...

    golang实现的读取excel模板批量生成excel工具.zip

    Excellize是一个用于读写Microsoft Excel (.xlsx)文件的Go库,支持创建、读取和修改Excel文件。利用这个库,我们可以方便地读取模板文件中的单元格数据,包括公式、样式等,并进行复制或修改。 批量生成Excel文件的...

Global site tag (gtag.js) - Google Analytics