`

利用POI在Excel文档任意单元格写入数据

阅读更多

 

        在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。

    ApacheJakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheetHSSFSheet)组成,一个sheet是由多个rowHSSFRow)组成,一个row是由多个cellHSSFCell)组成。

    那么,如何利用POI在Excel文档任意单元格写入数据?最近做了个项目,一个人研究了下,现在把代码拿出来和大家分享下!不足之处请前辈们多多指教!

 

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;

import org.apache.poi.hssf.record.PageBreakRecord.Break;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ReportBuilder 
{
	public static String outFile_Erro = "Load Template Erro,文件加载失败!!";
	
	FileOutputStream  fileOutputStream  =  null;
	
	HSSFWorkbook workbook = null;
	HSSFSheet	sheet = null;

	HSSFPatriarch  patriarch  =  null;
	
	/**
	 * @用途:加载一个已经存在的模板,将生成的内容保存到 workbook中
	 * @参数:String templateFile:指索要加载的模板的路径,如:"C:/Tamplates/texting-1.xls"
	 * @用法:templateFile:  String  templateFile_Name1 = "C:/Tamplates/texting-1.xls"			
	 * @author Yangcl
	 */	
	public  void loadTemplate(String templateURL)
	{
		// TODO Auto-generated method stub
		boolean a = templateURL.trim().indexOf(".xls") == -1;
		boolean b = templateURL.trim().indexOf(".XLS") == -1;
//		boolean c = templateURL.trim().indexOf(".xlsx") == -1;
//		boolean d = templateURL.trim().indexOf(".XLSX") == -1;
		if(templateURL == null  || templateURL.trim().equals("") )
		{
			//文件不能为空提示
			System.out.println("文件不能为空提示");
		}
		else if(a&&b)// && c&&d)
		{
			System.out.println("文件格式不正确!");
			
		}
		else{
			try{
				FileInputStream templateFile_Input = new FileInputStream(templateURL);			
				POIFSFileSystem fs = new POIFSFileSystem(templateFile_Input);
				
				workbook = new  HSSFWorkbook(fs);
				sheet =  workbook.getSheetAt(0);
				
				System.out.println("========"+templateURL+"文件加载已完成========");
			}catch(Exception e){
				System.err.println(outFile_Erro);
			}	
		}
				 
	}
	
	/**
	 * 写入非图片格式信息
	 * @描述:这是一个实体类,提供了相应的接口,用于操作Excel,在任意坐标处写入数据。
	 * @参数:String newContent:你要输入的内容
	 *  			 int beginRow :行坐标,Excel从 0 算起
	 * 				 int beginCol   :列坐标,Excel从 0 算起
	 * @author Yangcl
	 */
	public void writeInTemplate( String newContent, int beginRow, int beginCell)
	{	
		HSSFRow  row  = sheet.getRow(beginRow);	
		if(null == row ){
			//如果不做空判断,你必须让你的模板文件画好边框,beginRow和beginCell必须在边框最大值以内
			//否则会出现空指针异常
			row = sheet.createRow(beginRow);
		}
		HSSFCell   cell   = row.getCell(beginCell);
		if(null == cell){
			cell = row.createCell(beginCell);
		}
		//设置存入内容为字符串
		cell.setCellType(HSSFCell.CELL_TYPE_STRING);
		//向单元格中放入值
		cell.setCellValue(newContent);    
	}
	
	
	/**
	 * 写入图片格式信息
	 * @描述:这是一个实体类,提供了相应的接口,用于操作Excel,在任意坐标处写入数据。
	 * @参数:
	 * 				 String  imageFileURL:他接受一个外界传入的图片路径,图片以  *.jpeg 形式存在。
	 * 
	 * @用法:
	 * 				 ReportBuilder twi = new ReportBuilder();
	 * 				 String imageFileURL = "D:/workspace/Tamplates/1.jpeg"; 
	 * 				 twi.writeInTemplate(imageFileURL , 0,0, 0, 0, (short)6, 5, (short)8, 8);
	 * 
	 * @param dx1 :第一个cell开始的X坐标
	 * @param dy1 :第一个cell开始的Y坐标
	 * @param dx2 :第二个cell开始的X坐标
	 * @param dy2 :第二个cell开始的Y坐标
	 * @param col1   :图片的左上角放在第几个列cell (the column(o based); of the first cell)
	 * @param row1  :图片的左上角放在第几个行cell (the row(o based); of the first cell)
	 * @param col2   :图片的右下角放在第几个列cell (the column(o based); of the second cell)
	 * @param row2  :图片的右下角放在第几个行cell (the row(o based); of the second cell)
	 * 
	 * @author Yangcl
	 */
	public  void writeInTemplate(String  imageFileURL , int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2  )
	{	
		BufferedImage  bufferImage = null;
		
		//写入图片格式信息
		try
		{			
			ByteArrayOutputStream	  byteArrayOutputStream = new ByteArrayOutputStream();
			
			//先把读入的图片放到第一个 ByteArrayOutputStream 中,用于产生ByteArray   
			File fileImage = new File(imageFileURL);	
			
			bufferImage = ImageIO.read(fileImage);		
			ImageIO.write(bufferImage, "JPG", byteArrayOutputStream);
			System.out.println("ImageIO 写入完成");
			
			//准备插入图片
			HSSFPatriarch  patriarch  =  sheet.createDrawingPatriarch();
			HSSFClientAnchor  anchor  =   new  HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);	
			
			//插入图片	
			byte[] pictureData = byteArrayOutputStream.toByteArray();
			int pictureFormat   = HSSFWorkbook.PICTURE_TYPE_JPEG;
			int pictureIndex = workbook.addPicture(pictureData, pictureFormat);
			patriarch.createPicture(anchor, pictureIndex);
			
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("IO Erro:" + e.getMessage());
		}finally
		{
			if(fileOutputStream != null)
			{
				try{
					fileOutputStream.close();
				}catch(IOException io){
					io.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 写入图片格式信息
	 * @描述:这是一个实体类,提供了相应的接口,用于操作Excel,在任意坐标处写入数据。
	 * @参数:
	 * 				 ImageInputStream imageInputStream:他接受一个外界传入的图片流,图片以流形式存在。
	 * 
	 * @用法:
	 * 
	 * 
	 * 
	 * 
	 * @param dx1 :第一个cell开始的X坐标
	 * @param dy1 :第一个cell开始的Y坐标
	 * @param dx2 :第二个cell开始的X坐标
	 * @param dy2 :第二个cell开始的Y坐标
	 * @param col1   :图片的左上角放在第几个列cell (the column(o based); of the first cell)
	 * @param row1  :图片的左上角放在第几个行cell (the row(o based); of the first cell)
	 * @param col2   :图片的右下角放在第几个列cell (the column(o based); of the second cell)
	 * @param row2  :图片的右下角放在第几个行cell (the row(o based); of the second cell)
	 * 
	 * @author Yangcl
	 */
	public  void writeInTemplate(ImageInputStream imageInputStream , int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2  )
	{
		BufferedImage  bufferImage = null;		
		//写入图片格式信息
		try
		{			
			ByteArrayOutputStream	  byteArrayOutputStream = new ByteArrayOutputStream();		
			//先把读入的图片放到一个 ByteArrayOutputStream 中,用于产生ByteArray   		
			bufferImage = ImageIO.read(imageInputStream);		
			ImageIO.write(bufferImage, "JPG", byteArrayOutputStream);
			System.out.println("ImageIO 写入完成");
			
			//准备插入图片
			HSSFPatriarch  patriarch  =  sheet.createDrawingPatriarch();
			HSSFClientAnchor  anchor  =   new  HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);	
			
			//插入图片	
			byte[] pictureData = byteArrayOutputStream.toByteArray();
			int pictureFormat   = HSSFWorkbook.PICTURE_TYPE_JPEG;
			int pictureIndex = workbook.addPicture(pictureData, pictureFormat);
			patriarch.createPicture(anchor, pictureIndex);
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("IO Erro:" + e.getMessage());
		}finally
		{
			if(fileOutputStream != null)
			{
				try{
					fileOutputStream.close();
				}catch(IOException io){
					io.printStackTrace();
				}
			}
		}
	}
	/**
	 * 保存模板
	 * @描述:这个方法用于保存workbook(工作薄)中的内容,并写入到一个Excel文件中
	 * @参数:String templateFile:取得已经保存的类模板 路径名称
	 * @用法:templateFile:String  templateFile_Name1 = "C:/Tamplates/texting-1.xls"
	 * 				  TemplateAdapter ta  = new TemplateAdapter();
	 * 				  ta.SaveTemplate(templateFile_Name1);
	 * @param templateFile
	 */
	public void SaveTemplate(String templateFile)
	{
		try{
			
			//建立输出流
			fileOutputStream = new FileOutputStream(templateFile);
			workbook.write(fileOutputStream);
		
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("IO Erro" + e.getMessage());
		}finally
		{
			if(fileOutputStream != null)
			{
				try{
					fileOutputStream.close();
				}catch(IOException io){
					io.printStackTrace();
				}
			}
		}
	}

	
}

 

        这段代码是完整的。我开始找了很久关于如何利用POI在Excel文档任意单元格写入数据的文章,从而实现一个以面向服务为目标的报表系统,但很遗憾,在国内的网站上没有找到。而且介绍的比较基础,对于急需使用POI,但又没有时间仔细研究的人来说,难过急了。上面的代码有比较详细的注释,相信大家看的懂。如果您要转载这篇文章,请注明出处。开源万岁~祝您成功。文档依赖的两个 jar包:commons-codec-1.5.jar和poi-3.8-20120326.jar见附件。这字体真让人蛋疼菊紧!

 

 

 

 更多信息请浏览:http://www.open-open.com/home/space-135360-do-blog-id-9614.html

 

 

 

 

 

 

 

5
0
分享到:
评论
4 楼 l67721363 2015-02-28  
十分感谢~
3 楼 zhuobaobao 2014-10-17  
楼主好人 一生平安!!!
2 楼 gclxtx 2012-11-13  
楼主好人 一生平安!!!
1 楼 sankooc 2012-11-13  
顶 【5个字】

相关推荐

    java_poi导入excel通用工具类

    这个"java_poi导入excel通用工具类"是利用Java的POI库和一些额外的技术来实现对Excel数据的导入功能,使得开发人员能够方便地将Excel数据转化为Java对象或者对已有对象进行填充。下面我们将深入探讨相关的知识点。 ...

    VS2010/MFC 读写excel文件 操作类

    在这个类中,我们将定义方法来打开、读取、写入和关闭Excel文件。例如: 1. **打开Excel文件**:这通常涉及到创建一个`CComPtr`对象,它是MFC提供的智能指针,用于管理COM对象的生命周期。我们需要实例化一个`...

    jxls利用模板生成excel文件

    它利用Apache POI库操作Excel,并引入了类似于JSP标签的概念,使得开发者可以轻松地将数据绑定到Excel模板的各个单元格上。 ### 二、jxls的工作原理 1. **模板创建**:首先,你需要创建一个Excel模板文件,这个...

    【Qt QAxObject】使用 QAxObject 高效任意读写 Excel 表

    在Qt开发中,有时我们需要与Microsoft Office的组件交互,例如读取或写入Excel电子表格。在这种情况下,QAxObject类提供了一种有效的方式,它允许我们通过COM(Component Object Model)接口与ActiveX控件进行通信。...

    poi导入.下载导入任意数据对象

    下载导入任意数据对象"这个标题暗示了我们将讨论如何使用Apache POI来导入或下载数据,并将这些数据对象转换成Excel表格。 首先,我们需要理解Apache POI中的关键类。对于Excel操作,主要有以下几个: 1. **...

    java excel tree

    在Java编程领域,生成Excel报表是一项常见的任务,尤其在数据可视化和组织结构管理中。"java excel tree"这个主题正是关于如何使用Java来创建一个基于Excel的组织架构报表,它利用了组合模式和一系列算法来实现自动...

    SSM框架使用POI技术导出Excel.docx

    这些方法可以接受任意类型的对象,利用反射获取其属性并将其转换为Excel单元格的值。 最后,我们提到的`PageData`类看起来是一个扩展自`HashMap`的类,用于存储请求参数和数据。在导出Excel的过程中,可能并不直接...

    java实现excel转csv

    在Java编程环境中,将Excel文件(.xls或.xlsx格式)转换为CSV文件是一项常见的任务,特别是在数据处理和分析中。本文将深入探讨如何利用Java来完成这个过程,主要使用Apache POI库,这是一个广泛使用的开源库,专门...

    excel-demo.rar

    这个项目可能包含了代码示例,演示如何读取Excel文件并利用Java的反射机制将数据映射到JavaBean对象中。 Apache POI是Apache软件基金会的开源项目,主要为微软的Office文档格式提供读写功能,包括Excel(XLS、XLSX)...

    将任意sql查询结果导出只excel

    开发者会创建一个Excel工作簿对象,然后在其中创建工作表,并将结果集中的每一行数据写入工作表的一个单元格。对于更复杂的格式化或者处理,例如合并单元格、设置数据格式等,Apache POI也提供了相应的API。 标签...

    java将数据导出到Excel表格(java源程序+jxl.jar包)

    4. **创建Label和Cell**:Label用于在特定单元格设置文本,而Cell则可以包含任意类型的数据。你可以使用`WritableSheet`的`writeLabel()`和`writeString()`方法。 ```java Label label = new Label(0, 0, "Name");...

    JdbcExcel纯Java连接Excel

    总的来说,纯Java连接Excel是Java开发者必备的一项技能,尤其在数据处理、报告生成或自动化测试等场景中。利用Apache POI库,开发者可以灵活地创建、修改和读取Excel文件,实现数据的导入导出,提高工作效率。结合...

    poi-bin-3.0-FINAL-20070503.tar.gz

    3. 写入单元格数据:在工作表的行和列上创建`Cell`对象,并设置其值。 4. 读取单元格数据:通过行和列索引访问`Cell`,然后获取其中的值。 5. 格式化数据:可以设置单元格的样式,如字体、颜色、对齐方式、边框等。 ...

    web导出Excel笔记

    综上所述,要实现在Web页面上导出数据为Excel文件,需要结合前端触发、后端处理以及合适的工具库(如Apache POI)。本文详细介绍了整个流程中的关键步骤和技术点,希望能对实际项目开发有所帮助。

    htmlunit爬取网页并保存成Excel

    这个项目可能是在利用HTMLUnit来抓取特定网站的数据,并将这些数据整理成Excel表格,以便于分析或存储。以下是对这个主题的详细解释: 1. **HTMLUnit简介**: HTMLUnit是一个Java库,它提供了对Web应用程序的头...

    jxl-2.6.12.jar

    在Java开发中,处理Excel数据是一项常见的任务,尤其在数据导入导出、报表生成等领域。针对这一需求,Java社区提供了多种库,其中jxl是一个广受欢迎的选择。本文将深入探讨jxl库的最新版本——jxl-2.6.12.jar,揭示...

    SOAOFFICE - 微软 OFFICE 中间件

    24.需要在web页面导入导出Excel单元格数据的; ……… SOAOFFICE中间件包括三个内置组件:SOAExcel、SOAWord、SOAPowerPoint。另外企业版还包括支持PDF文件的SOAPDF组件。 SOAOFFICE 中间件采用标准HTTP传输协议,...

    JavaWeb 最强工具类

    在处理大量数据时,Excel文件是常用的格式,Java提供了多种库来实现Excel的读写,如Apache POI。通过POI,我们可以创建新的工作簿,添加工作表,填充单元格,读取数据,甚至处理复杂的公式和样式。以下是一个简单的...

Global site tag (gtag.js) - Google Analytics