图片用Excel画出来(JAVA)

能够将任何图片在excel上利用单元格背景完整的描绘出来。
像网络上出现的用excel画出超级玛丽等等,各种图片都能在excel上"画"出来。

图片我没有经过特殊处理,所以转换的图片不能太大,有多大的图片就要有多少的单元格。如640*480就有307200的单元格。


如要转换的图片:


转换后在excel中的效果:


没多大意义练练手:


import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Locale;

import javax.swing.ImageIcon;

import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Colour;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Helper {
	private  BufferedImage getBufferedImage(String filepath)
	{
		ImageIcon imgicon=new ImageIcon(filepath);
		 BufferedImage bufferedImage = new BufferedImage(imgicon.getIconWidth(),imgicon.getIconHeight(),BufferedImage.TYPE_INT_RGB);     

		 bufferedImage.createGraphics().drawImage(imgicon.getImage(), 0, 0,null);
		 return bufferedImage;
		 
	}
	
	private  Colour getNearestColour(Color awtColor) {  
	     Colour color = null;  
	     Colour[] colors = Colour.getAllColours();  
	     if ((colors != null) && (colors.length > 0)) {  
	      Colour crtColor = null;  
	      int[] rgb = null;  
	      int diff = 0;  
	      int minDiff = 999;  
	     
	      for (int i = 0; i < colors.length; i++) {  
	       crtColor = colors[i];  
	       rgb = new int[3];  
	       rgb[0] = crtColor.getDefaultRGB().getRed();  
	       rgb[1] = crtColor.getDefaultRGB().getGreen();  
	       rgb[2] = crtColor.getDefaultRGB().getBlue();  
	     
	       diff = Math.abs(rgb[0] - awtColor.getRed())  
	         + Math.abs(rgb[1] - awtColor.getGreen())  
	         + Math.abs(rgb[2] - awtColor.getBlue());  
	     
	       if (diff < minDiff) {  
	        minDiff = diff;  
	        color = crtColor;  
	       }  
	      }  
	     }  
	     if (color == null)  
	      color = Colour.BLACK;  
	     return color;  
	    }  
	public void exec(String convertFromImage,String createxls) throws Exception
	{
		
		WorkbookSettings ws = new WorkbookSettings();
	    ws.setLocale(new Locale("en", "EN"));
	    WritableWorkbook workbook = Workbook.createWorkbook(new File(createxls), ws);
	    WritableSheet s2 = workbook.createSheet("picture", 0);
	    BufferedImage buffimage=   getBufferedImage(convertFromImage);
	    int width=buffimage.getWidth();
	    int heigh=buffimage.getHeight();
	    for(int i=0;i<width;i++)
	    {
	        for(int h=0;h<heigh;h++)
		    {
	            WritableCellFormat greyBackground = new WritableCellFormat();
	            Color c = new Color(buffimage.getRGB(i, h));  
	           
	    	
			    greyBackground.setBackground( getNearestColour(c) );
			  
			    Label  lr = new Label(i, h, "", greyBackground);
		
			    s2.addCell(lr);
		    }
	    	
	    }
	    
	
	    

       //写入Excel对象 
	    workbook.write(); 

	
	    workbook.close();
		
	}
	/**
	 * @param args
	 * @throws IOException 
	 * @throws BiffException 
	 */
	public static void main(String[] args) throws Exception {
		Helper helper=new Helper();

		System.out.println("输入的图片:"+args[0]);
		System.out.println("输出的excel:"+args[1]);
		System.out.println("转换开始");
		//转换执行的方法参数 args[0]输入的图片路径 args[1]输出的excel路径
//		helper.exec( "mslogo.jpg","1.xls");
		helper.exec(args[0],args[1]);
	}

}



<think> 首先,用户的问题是:“我想查找使用Java实现Excel画图形的方法 请问Java实现Excel画图形的方法”。这表明用户想了解如何在Java中使用Excel(可能通过库如Apache POI)来绘制图形。 我收到了几个引用: - 引用[1]:讨论Java中将Excel图片的方法,提到了商业库和开源库。 - 引用[2]:描述如何导入带有图像的Excel文件,使用Apache POI处理图像。 - 引用[3]:提到在POI中网格的方法,通过线模拟。 - 引用[4]:直接说明如何使用POI在Excel线和椭圆。 用户的问题焦点是“Excel画图形的方法”,所以我需要专注于如何在Excel中绘制图形(如线条、形状),而不是转换或其他。 关键引用是[3]和[4]: - 引用[3]:说在POI中,没有直接网格的方法,但可以通过线来模拟。 - 引用[4]:具体展示了如何使用POI线和椭圆。 我的回答需要: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 引用结束时自然地添加引用标识。 - 生成相关问题。 - 对于数学表达式,使用$...$格式;独立公式用$$...$$格式,但由于本主题是编程,可能数学表达式较少,如果有的话,需要正确格式。 - 回答真实可靠。 步骤: 1. **理解用户需求**:用户想用Java实现在Excel中绘制图形,如线条、形状。 2. **基于引用构建回答**: - 使用Apache POI库(开源库)是常见方法。 - 引用[3]和[4]提供线索:线、椭圆等。 - 引用[2]提到图像处理,但用户是画图形(可能是矢量图形),不是插入图片。 3. **回答结构**: - 介绍方法:使用Apache POI库。 - 逐步解释如何实现:创建Excel文件、添加形状等。 - 提供代码示例(基于引用)。 - 引用相关引用。 - 生成相关问题。 4. **代码示例**:从引用[4]中提取代码片段。 - 引用[4]:"HSSFSimpleShape.OBJECT_TYPE_LINE线",表示设置形状类型为线。 - 代码示例:展示如何线和椭圆。 5. **添加引用**:在引用结束时自然地添加引用标示,如[^1], [^2]等。 6. **生成相关问题**:在结尾添加相关的问题部分。 代码示例需要清晰: - 使用Markdown代码块。 - 基于POI,因为引用提到POI。 核心方法: - 使用Apache POI的HSSF(旧版)或XSSF(新版Excel)类。 - 创建形状对象(如HSSFSimpleShape)并设置类型(如线、椭圆)。 完整回答框架: - 引言:介绍Java中使用Apache POI库在Excel中绘制图形。 - 步骤: 1. 添加POI依赖。 2. 创建工作簿和工作表。 3. 创建形状并设置属性(位置、大小、类型)。 4. 保存文件。 - 代码示例:展示线和椭圆。 - 注意事项:如引用[3],POI没有直接网格的方法,但可通过多条线模拟。 - 生成相关问题。 相关问题: 1. 如何更复杂的图形? 2. POI有哪些其他绘图功能? 3. 如何处理不同Excel版本的兼容性? 确保回答真实可靠:基于POI文档和引用。 </think> ### Java实现Excel画图形的方法 在Java中实现Excel画图形(如线条、椭圆等),主要通过开源库Apache POI来完成。POI提供了HSSF(用于旧版.xls格式)和XSSF(用于新版.xlsx格式)模块,允许创建和修改形状(Shape)。以下我会一步步为您解释实现方法,基于引用中的关键信息构建。核心思路是:使用POI的绘图API创建形状对象,设置类型(如线、椭圆)、位置和大小等属性。 #### 1. **准备工作:添加依赖和环境配置** 在项目中引入Apache POI依赖(推荐使用Maven或Gradle)。以下是Maven依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> <!-- 使用最新稳定版 --> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` 如果您使用的是.xlsx格式,确保包含`poi-ooxml`;如果是.xls格式,则只需`poi`。 #### 2. **基本步骤:创建Excel并绘制图形** Apache POI通过`Drawing`对象作为布,在其中添加形状(Shape)。具体步骤如下: 1. **创建工作簿和工作表**:创建Excel文件的基础结构。 2. **创建绘图布**:从工作表获取或创建绘图对象(Drawing),用于放置形状。 3. **添加形状**:创建形状对象(如`HSSFSimpleShape`或`XSSFSimpleShape`),设置形状类型(如线或椭圆)、位置、大小等。 4. **设置图形属性**:可选设置线条颜色、填充等。 5. **保存Excel文件**:将工作簿写入文件。 以下是一个完整代码示例,展示如何一条直线和一个椭圆(基于引用[4]和引用[3]的实现思路)。 ```java import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import java.io.FileOutputStream; public class ExcelDrawShapes { public static void main(String[] args) throws Exception { // 1. 创建Excel工作簿和工作表(使用HSSF处理.xls格式) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Shape Demo"); // 创建名为"Shape Demo"的工作表 [^3] // 2. 创建绘图布(Drawing),用于放置形状 HSSFPatriarch drawing = sheet.createDrawingPatriarch(); // 获取绘图对象 // 3. 添加一条直线 // 设置起始和结束坐标(单位:1/20点,示例中从(0,0)(100,100)) HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 1023, 255, (short) 0, 0, (short) 5, 5); HSSFSimpleShape line = drawing.createSimpleShape(anchor1); line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); // 设置形状类型为线 [^4] line.setLineStyleColor(0, 0, 255); // 设置线条颜色为蓝色(RGB格式) // 4. 添加一个椭圆 HSSFClientAnchor anchor2 = new HSSFClientAnchor(100, 100, 500, 500, (short) 6, 6, (short) 10, 10); HSSFSimpleShape oval = drawing.createSimpleShape(anchor2); oval.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); // 设置形状类型为椭圆 [^4] oval.setFillColor(255, 0, 0); // 设置填充颜色为红色 // 5. 保存Excel文件 FileOutputStream out = new FileOutputStream("excel_with_shapes.xls"); workbook.write(out); out.close(); System.out.println("Excel文件已创建,包含图形!"); } } ``` #### 3. **关键点解释** - **形状类型**:POI定义了多种形状类型,如`OBJECT_TYPE_LINE`(线)、`OBJECT_TYPE_OVAL`(椭圆)、`OBJECT_TYPE_RECTANGLE`(矩形)等。通过`setShapeType`方法设置 [^4]。 - **坐标定位**:使用`HSSFClientAnchor`或`XSSFClientAnchor`指定形状位置: - 参数:`dx1, dy1, dx2, dy2, col1, row1, col2, row2`,其中`col`和`row`表示单元格索引,`dx/dy`表示像素偏移。 - 示例中,`(short) 0, 0, (short) 5, 5` 表示线条从第0行第0列延伸到第5行第5列。 - **模拟复杂图形**:POI不直接支持网格(Grid),但可通过绘制多条线来模拟(如引用[3]所述)。例如,循环创建多条水平和垂直线构建表格 [^3]。 - **版本适配**: - 对于.xlsx格式(XSSF),使用`XSSFDrawing`和`XSSFSimpleShape`,方法与HSSF类似。 - 图像处理(如引用[2]提到的图像导入)与绘制形状不同,绘制形状是矢量图形而非位图 [^2]。 #### 4. **注意事项** - **性能**:POI适合简单图形绘制;复杂图形可能导致文件过大或性能下降,建议优化坐标计算。 - **兼容性**:POI免费但功能有限;商业库(如Aspose.Cells)提供更强大API(如直接网格),但需付费(见引用[1])[^1]。 - **错误处理**:代码中需要异常处理(如`IOException`),确保文件操作安全。 通过以上方法,您可以轻松在Excel中添加基本形状。如果需要更高级功能(如动态图形或交互),可结合其他库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值