如何用java代码操作excel,并且导出80万数据

Apache poi简介

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能

Apache poi常用的类

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。

3个不同的工具类

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;

XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;

当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。

操作步骤

创建一个excel需要八步

a) 创建一个工作簿 workbook

b 创建一个工作表 sheet

c) 创建一个行对象 row(下标起始值为0)

d) 创建一个单元格对象cell(下标起始值为0)

e) 给单元格设置内容

f) 设置单元格的样式,设置字体和字体的大小

g) 保存,关闭流对象

h) 下载

进入编写代码阶段

第一个demo

//    a) 创建一个工作簿 workbook
    Workbook book = new HSSFWorkbook();
    
//    b 创建一个工作表 sheet
    Sheet sheet = book.createSheet();
    
//    c) 创建一个行对象 row(下标起始值为0)
    Row row = sheet.createRow(0);
    
//    d) 创建一个单元格对象cell(下标起始值为0)
    Cell cell = row.createCell(0);
    
//    e) 给单元格设置内容
    cell.setCellValue("2018年货运清单");
    
//    f) 设置单元格的样式,设置字体和字体的大小
//    g) 保存,关闭流对象
    book.write(new FileOutputStream("F:/货运单.xls"));// 将文件命名并保存在f盘下
    System.out.println("成功");
    book.close();

刷新之后F盘出现文件

文件内容

设置样式

//    a) 创建一个工作簿 workbook
    Workbook book = new HSSFWorkbook();

//    b 创建一个工作表 sheet
    Sheet sheet = book.createSheet();
    // 合并单元格 (CellRangeAddress类中的参数指的是地址--将第一行的8个单元格合并)
    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));

//    c) 创建一个行对象 row(下标起始值为0)
    Row row = sheet.createRow(0);
    // 将这一行设置行高为50
    row.setHeightInPoints(50);

//    d) 创建一个单元格对象cell(下标起始值为0)
    Cell cell = row.createCell(0);

//    e) 给单元格设置内容
    cell.setCellValue("2018年货运清单");

//    f) 设置单元格的样式,设置字体和字体的大小
    CellStyle style = book.createCellStyle();
    // 创建字体样式
    Font font = book.createFont();
    font.setBold(true);// 加粗
    font.setFontName("宋体");//字体设置为宋体
    font.setFontHeightInPoints((short) 20);//20号字体
    style.setAlignment(CellStyle.ALIGN_CENTER); // 纵向居中
    style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    
    style.setFont(font);
    
    cell.setCellStyle(style);
//    g) 保存,关闭流对象
    book.write(new FileOutputStream("F:/货运单.xls"));// 将文件命名并保存在f盘下
    System.out.println("成功");
    book.close();
//    h) 下载

导入模板

//获取webapp下的模板文件
    String filePath = ServletActionContext.getServletContext().getRealPath("/make/xlsprint/tOUTPRODUCT.xlsx");
    FileInputStream is = new FileInputStream(filePath);
    Workbook book = new XSSFWorkbook(is);
    //从sheet的第一行
    Sheet sheet = book.getSheetAt(0);

    int rowIndex = 0;

    // 大标题
    Row bigTitleRow = sheet.getRow(rowIndex++);
    Cell bigCell = bigTitleRow.getCell(1);

    // 标题内容
    String titleStr = inputDate.replace("-0", "-").replaceAll("-", "年") + "月份出货表";
    bigCell.setCellValue(titleStr);

    // 小标题
    rowIndex++;

    // 内容
    // 保存样式
    //获取内容每一个单元格的样式
    CellStyle cs01 = sheet.getRow(rowIndex).getCell(1).getCellStyle();
    String stringCellValue = sheet.getRow(rowIndex).getCell(1).getStringCellValue();
    System.out.println("获取的第一列信息" + stringCellValue);
    CellStyle cs02 = sheet.getRow(rowIndex).getCell(2).getCellStyle();
    CellStyle cs03 = sheet.getRow(rowIndex).getCell(3).getCellStyle();
    CellStyle cs04 = sheet.getRow(rowIndex).getCell(4).getCellStyle();
    CellStyle cs05 = sheet.getRow(rowIndex).getCell(5).getCellStyle();
    CellStyle cs06 = sheet.getRow(rowIndex).getCell(6).getCellStyle();
    CellStyle cs07 = sheet.getRow(rowIndex).getCell(7).getCellStyle();
    CellStyle cs08 = sheet.getRow(rowIndex).getCell(8).getCellStyle();

    // 写出excel
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    HttpServletResponse response = ServletActionContext.getResponse();

    DownloadUtil util = new DownloadUtil();
    book.write(os);
    util.download(os, response, titleStr + ".xlsx");
    return NONE;

首先查看一下我们的模板文件,在webapp下

接着是我们添加的内容

操作百万级数据


   Workbook book = new SXSSFWorkbook();
    Sheet sheet = book.createSheet();
    
    // 设置列宽
    sheet.setColumnWidth(1, 25 * 256);
    sheet.setColumnWidth(2, 10 * 256);
    sheet.setColumnWidth(3, 25 * 256);
    sheet.setColumnWidth(4, 10 * 256);
    sheet.setColumnWidth(5, 10 * 256);
    sheet.setColumnWidth(6, 10 * 256);
    sheet.setColumnWidth(7, 10 * 256);
    sheet.setColumnWidth(8, 10 * 256);
    
    int rowIndex = 0;
    // 大标题
    Row bigTitleRow = sheet.createRow(rowIndex++);
    bigTitleRow.setHeightInPoints(36);
    Cell bigCell = bigTitleRow.createCell(1);
    bigCell.setCellStyle(bigTitle(book));
    // 合并单元格
    sheet.addMergedRegion(new CellRangeAddress(0,0,1,8));
    // 标题内容  inputDate 2015年7月份出货表
    String titleStr = inputDate.replace("-0", "-").replace("-", "年")+"月份出货表";
    bigCell.setCellValue(titleStr);
    
    // 小标题
    String[] smartStrs = {"客户","订单号","货号","数量","工厂","工厂交期","船期","贸易条款"};
    Row smartRow = sheet.createRow(rowIndex++);
    smartRow.setHeightInPoints(26);
    for (int i=0; i < smartStrs.length ; i++) {
      Cell smartCell = smartRow.createCell(i+1);
      smartCell.setCellValue(smartStrs[i]); //设置内容
    }
    
    // 内容
    for (int i = 0; i < 800000; i++) {

      Row contentRow = sheet.createRow(rowIndex++);
      contentRow.setHeightInPoints(26);

      Cell cell01 = contentRow.createCell(1);
      cell01.setCellValue(i);
      
      Cell cell02 = contentRow.createCell(2);
      cell02.setCellValue(i+1);
      
      Cell cell03 = contentRow.createCell(3);
      cell03.setCellValue(i+2);
      
      Cell cell04 = contentRow.createCell(4);
      cell04.setCellValue(i+3);
      
      Cell cell05 = contentRow.createCell(5);
      cell05.setCellValue(i*+4);
      
  
    }
    // 写出excel
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    HttpServletResponse response = ServletActionContext.getResponse();
    String returnName = titleStr + ".xls";
    response.setContentType("application/octet-stream;charset=utf-8");
    returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));  
    response.addHeader("Content-Disposition",   "attachment;filename=" + returnName);  
    ServletOutputStream outputStream2 = response.getOutputStream();
    
    book.write(outputStream2);
    book.close();
    
    return NONE;

整整80万条数据哦

因为小编数据库没什么数据,所以暂时用for循环来凑数哈哈

补充

由于大家并没有全部使用mavne来构建项目,但小编是用maven来构建项目的,所以大家可以根据上面的代码来自己导入jar包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值