Windows中使用Java生成Excel文件并插入图片的方法

生成简单的Excel文件
 在现实的办公中,我们常常会有这样一个要求:要求把报表直接用excel打开。在实习中有这样一个需求。根据所选择的资源查询用户所提供附件的全部信息并生成excel供下载。但是在查询的时候我们需要来检测用户所提供的附件里面的信息是否有错误(身份证)。有错误的生成错误信息excel。
     Apache的POI项目,是目前比较成熟的HSSF接口,用来处理Excel对象。其实POI不仅仅只能处理excel,它还可以处理word、PowerPoint、Visio、甚至Outlook。
     这里我先介绍利用POI如何生成excel。
     首先在生成Excel前,我们需要理解一下Excel文件的组织形式。在POI中,是这样理解的:一个Excel文件对应一个workbook,一个workerbook是有若干个sheet组成的。一个sheet有多个row,一个row一般存在多个cell。
     对于上面的四个名词我们可以在下图理解

对于生成Excel,POI提供了如下几个基本对象:

  • HSSFWorkbook:excel 的文档对象
  • HSSFSheet:excel 的表单
  • HSSFRow :excel 的行
  • HSSFCell:excel 的格子单元

从上面的图片和Excel的组织结构,我们就可以明白创建Excel的步骤。

1、生成文档对象HSSHWorkbook。
        2、通过HSSFWorkbook生成表单HSSFSheet。
        3、通过HSSFSheet生成行HSSFRow
        4、通过HSSFRow生成单元格HSSFCell。
     下面是展示代码:
     身份证错误Bean(ErrorCondition.java)

public class ErrorCondition {
  private String name; // 姓名
  private String idCard; // 身份证
  private String status; // 错误状态
  private String message; // 错误信息 

  ErrorCondition(String name,String idCard,String status,String message){
    this.name = name;
    this.idCard = idCard;
    this.status = status;
    this.message = message;
  } 

  public String getName() {
    return name;
  } 

  public void setName(String name) {
    this.name = name;
  } 

  public String getIdCard() {
    return idCard;
  } 

  public void setIdCard(String idCard) {
    this.idCard = idCard;
  } 

  public String getStatus() {
    return status;
  } 

  public void setStatus(String status) {
    this.status = status;
  } 

  public String getMessage() {
    return message;
  } 

  public void setMessage(String message) {
    this.message = message;
  } 

}

处理类(ExportErrorExcel.java)

public class ExportErrorExcel {
  public static void main(String[] args) {
    //第一步创建workbook
    HSSFWorkbook wb = new HSSFWorkbook(); 

    //第二步创建sheet
    HSSFSheet sheet = wb.createSheet("身份证错误信息"); 

    //第三步创建行row:添加表头0行
    HSSFRow row = sheet.createRow(0);
    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //居中 

    //第四步创建单元格
    HSSFCell cell = row.createCell(0);     //第一个单元格
    cell.setCellValue("姓名");         //设定值
    cell.setCellStyle(style);          //内容居中 

    cell = row.createCell(1);          //第二个单元格
    cell.setCellValue("身份证");
    cell.setCellStyle(style); 

    cell = row.createCell(2);          //第三个单元格
    cell.setCellValue("错误状态");
    cell.setCellStyle(style); 

    cell = row.createCell(3);          //第四个单元格
    cell.setCellValue("错误信息");
    cell.setCellStyle(style); 

    //第五步插入数据
    List<ErrorCondition> list = ExportErrorExcel.getErrorCondition();
    for (int i = 0; i < list.size(); i++) {
      ErrorCondition errorCondition = list.get(i);
      //创建行
      row = sheet.createRow(i+1);
      //创建单元格并且添加数据
      row.createCell(0).setCellValue(errorCondition.getName());
      row.createCell(1).setCellValue(errorCondition.getIdCard());
      row.createCell(2).setCellValue(errorCondition.getStatus());
      row.createCell(3).setCellValue(errorCondition.getMessage());
    } 

    //第六步将生成excel文件保存到指定路径下
    try {
      FileOutputStream fout = new FileOutputStream("D:\\errorCondition.xls");
      wb.write(fout);
      fout.close();
    } catch (IOException e) {
      e.printStackTrace();
    } 

    System.out.println("Excel文件生成成功...");
  } 

  public static List<ErrorCondition> getErrorCondition(){
    List<ErrorCondition> list = new ArrayList<ErrorCondition>(); 

    ErrorCondition r1 = new ErrorCondition("张三", "4306821989021611", "L", "长度错误");
    ErrorCondition r2 = new ErrorCondition("李四", "430682198902191112","X", "校验错误");
    ErrorCondition r3 = new ErrorCondition("王五", "", "N", "身份证信息为空"); 

    list.add(r1);
    list.add(r2);
    list.add(r3); 

    return list;
  }
}

通过上面六个步骤就可以在指定的位置生成Excel文件了。

 java POI实现向Excel中插入图片
 做Web开发免不了要与Excel打交道。今天老大给我一个任务-导出Excel。开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可。但是有一点不同,就是要加入图片,就是这个加入图片搞了好久。同时网络上确实没有发现比较好的资料,所以写这篇博文记录之,供自己和博友们查询,参考。
       在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片。所以要在Excel中插入图片,三步就可以搞定。一、获取HSSFPatriarch对象,二、new HSSFClientAnchor对象,三、调用createPicture方法即可。实现倒是非常容易实现,如果想把它做好还是有点儿难度的。这里我们先插入一张图片:

public class ExcelImageTest {
  public static void main(String[] args) {
     FileOutputStream fileOut = null;
     BufferedImage bufferImg = null;
    //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
    try {
      ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
      bufferImg = ImageIO.read(new File("F:/图片/照片/无名氏/小昭11.jpg"));
      ImageIO.write(bufferImg, "jpg", byteArrayOut); 

      HSSFWorkbook wb = new HSSFWorkbook();
      HSSFSheet sheet1 = wb.createSheet("test picture");
      //画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
      HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
      //anchor主要用于设置图片的属性
      HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 5, 8);
      anchor.setAnchorType(3);
      //插入图片
      patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
      fileOut = new FileOutputStream("D:/测试Excel.xls");
      // 写入excel文件
       wb.write(fileOut);
       System.out.println("----Excle文件已生成------");
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      if(fileOut != null){
         try {
          fileOut.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

如下为执行后的结果:

至于为什么会是这样的结果,主要是因为HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 5, 8)这个构造函数造成的,下面我就来解释这个构造函数:HSSFClientAnchor(int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2);各个参数的含义如下:

  • dx1:the x coordinate within the first cell。
  • dy1:the y coordinate within the first cell。
  • dx2:the x coordinate within the second cell。
  • dy2:the y coordinate within the second cell。
  • col1:the column (0 based) of the first cell。
  • row1:the row (0 based) of the first cell。
  • col2:the column (0 based) of the second cell。
  • row2:the row (0 based) of the second cell。

这里dx1、dy1定义了该图片在开始cell的起始位置,dx2、dy2定义了在终cell的结束位置。col1、row1定义了开始cell、col2、row2定义了结束cell。

下面是有两个不同的构造函数所创建的,从这幅图中我们可以清晰看到上面八个参数的含义和不同之处。

上面是插入一张图片,那么实现插入多张图片呢?其实很简单,构造多个不同的HSSFClientAnchor对象,控制好那八个参数,如下:

HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 1023,100,(short) 1, 1, (short)5, 8);
      HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 1023,100,(short) 1, 9, (short)5, 16); 

      //插入图片
      patriarch.createPicture(anchor1, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
      patriarch.createPicture(anchor2, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));

其余代码一样,得到如下结果:

(0)

相关推荐

  • java实现合并单元格的同时并导出excel示例

    介绍 POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI可以操作的文档格式有excel,word,powerpoint等,POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet. 跨第1行第1个到第2个单元格的操作为 sheet.addMergedRegion(new Region(0,(short)0,0,(short)1)); 跨第1行第1个到第2行第1个单元格的操作为 sheet.addMe

  • Java web的读取Excel简单实例代码

    目录结构: Data.xls数据: 后台页面: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println(this.getServletContext().getRealPath ("/")); try{ Workbook wb = Workbook.getWorkbook(

  • java实现Excel的导入、导出

    一.Excel的导入 导入可采用两种方式,一种是JXL,另一种是POI,但前者不能读取高版本的Excel(07以上),后者更具兼容性.由于对两种方式都进行了尝试,就都贴出来分享(若有错误,请给予指正) 方式一.JXL导入  所需jar包 JXL.jar publicstaticList<PutStorageInfo> readExcelByJXL(String filePath){ List<PutStorageInfo> infoList =newArrayList<Put

  • java导出大批量(百万以上)数据的excel文件

    本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下 1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成Workbook时清理数据,所以2007导出量更大; 2.可以导出多个excel文件到某个目录中,然后打包下载; 3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式: 代码如下: package com.e

  • java 文件大数据Excel下载实例代码

    java 文件大数据Excel下载实例代码 excel可以用xml表示.故可以以此来实现边写边下载文件 package com.tydic.qop.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.I

  • java利用注解实现简单的excel数据读取

    实现工具类 利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了. 定义注解: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Excel { String name(); } 由于本例中只涉及根据Excel表头部分对Excel进行解析,只定义了一个name作为和Excel表头的隐射

  • java实现excel和txt文件互转

    话不多说,请看代码: import java.io.*; import jxl.*; import jxl.write.*; //用java将txt数据导入excel public class CreateXLS { public static void main(String args[]) { try { //打开文件 WritableWorkbook book= Workbook.createWorkbook(new File("测试.xls")); //生成名为"第一

  • java导出Excel通用方法的实例详解

    java导出Excel通用方法的实例详解 Java导出Excel通用方法,只需要一个list 集合.通用方法改进之处踊跃提出 package oa.common.utils; import java.io.OutputStream; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import java.lan

  • java编程实现根据EXCEL列名求其索引的方法

    本文实例讲述了java编程实现根据EXCEL列名求其索引的方法.分享给大家供大家参考,具体如下: 原理: [a1-z26]*26^n-1 + [a1-z26]*26^n-2 + ... + [a1-z26]*26^0 具体代码如下: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.util.HashMap; import jav

  • Windows中使用Java生成Excel文件并插入图片的方法

    生成简单的Excel文件  在现实的办公中,我们常常会有这样一个要求:要求把报表直接用excel打开.在实习中有这样一个需求.根据所选择的资源查询用户所提供附件的全部信息并生成excel供下载.但是在查询的时候我们需要来检测用户所提供的附件里面的信息是否有错误(身份证).有错误的生成错误信息excel.      Apache的POI项目,是目前比较成熟的HSSF接口,用来处理Excel对象.其实POI不仅仅只能处理excel,它还可以处理word.PowerPoint.Visio.甚至Outl

  • Java生成pdf文件或jpg图片的案例讲解

    在一些业务场景中,需要生成pdf文件或者jpg图片,有时候还需要带上水印.我们可以事先用freemarker定义好html模板,然后把模板转换成pdf或jpg文件. 同时freemarker模板还支持变量的定义,在使用时可以填充具体的业务数据. 1.Maven导包 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</ar

  • Java实现读取及生成Excel文件的方法

    本文实例讲述了Java实现读取及生成Excel文件的方法.分享给大家供大家参考,具体如下: 一.读取Excel文件 需要先下载poi-3.0.1-FINAL-20070705.jar(点击此处本站下载poi-3.0.1-FINAL-20070705.jar.) ExcelExamRead.java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.p

  • Java中使用DOM4J生成xml文件并解析xml文件的操作

    目录 一.前言 二.准备依赖 三.生成xml文件生成标准展示 四.解析xml文件 五.总结 一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理一下自己的理解,只适合刚刚学习的,一起理解!今天我们把解析xml文件和生成xml文件在一起来展示. 二.准备依赖 <dependency> <groupId>dom4j</groupId&

  • 利用POI生成EXCEL文件的方法实例

    一.背景 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件.Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008). 根据指定格式的JSON文件生成对应的excel文件,需求如下 支持多sheet 支持单元格合并 支持插

  • SpringBoot 导出数据生成excel文件返回方式

    一.基于框架 1.IDE IntelliJ IDEA 2.软件环境 Spring boot mysql mybatis org.apache.poi 二.环境集成 1.创建spring boot项目工程 略过 2.maven引入poi <!--数据导出依赖 excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apac

  • Java实现Excel文件加密解密的示例代码

    目录 概述 示例大纲 工具 Java代码示例 示例1加密工作簿 示例2解密工作簿 示例3加密工作表 示例4加密工作表指定数据范围 示例5设置工作表公式隐藏 示例6解密Excel工作表 概述 设置excel文件保护时,通常可选择对整个工作簿进行加密保护,打开文件时需要输入密码:或者对指定工作表进行加密,即设置表格内容只读,无法对工作表进行编辑.另外,也可以对工作表特定区域设置保护,即设置指定区域可编辑或者隐藏数据公式,保护数据信息来源.无需设置文档保护时,可撤销密码保护,即解密文档.下面,将通过j

  • Java实现Excel文件转PDF(无水印无限制)

    目录 前言 一.jar破解 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二.Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也不能做出来非常好用,再说谁会不赚钱,花费一年事件去研究java如何实现excel转pdf的,于是我找到了Aspose公司出的aspose-cells的java的jar包来实现.之前写过一篇技

  • Java操作Excel文件解析与读写方法详解

    目录 一.概述 二.Apache POI 三.XSSF解析Excel文件 1.Workbook(Excel文件) 2.Sheet(工作簿) 3.Row(数据行) 4.Cell(单元格) 四.超大Excel文件读写 1.使用POI写入 2.使用EasyExcel 一.概述 在应用程序的开发过程中,经常需要使用 Excel 文件来进行数据的导入或导出.所以,在通过Java语言实现此 类需求的时候,往往会面临着Excel文件的解析(导入)或生成(导出). 在Java技术生态圈中,可以进行Excel文件

  • Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.WriteFile的方法: 复制代码 代码如下: FileInfo fi = new FileInfo(excelFile);//excelFile为文件在服务器上的地址 HttpResponse contextResponse = HttpContext.Current.Response; cont

随机推荐