`

POI插入图片的尺寸计算

 
阅读更多

 

 

CreationHelper helper = wb.getCreationHelper();
	    Drawing drawing = sheet.createDrawingPatriarch();
	    ClientAnchor anchor = helper.createClientAnchor();
	    int pictureIdx = wb.addPicture(IOUtils.toByteArray(new FileInputStream("img.png")), Workbook.PICTURE_TYPE_PNG);
	    
	    anchor.setRow1(5);
	    anchor.setCol1(3);
	    anchor.setDx1(40);
	    anchor.setDy1(8);
	    
	    anchor.setRow2(5);
	    anchor.setCol2(3);
	    anchor.setDx2(741);
	    anchor.setDy2(152);
	    
	    drawing.createPicture(anchor, pictureIdx);

 插入一个301PX * 301 px的图片代码如上。

经过计算

 

上面的例子列宽度16000,行高度8000

 

301px ≈ 701dx ≈ 144 dy
dx ≈ (301/701)*(16000/colWidth)*目标像素
dy ≈ (301/144)*(8000/rowHeight)*目标像素

 

/**
	 * excel的长度计算复杂有没有文档,也没找到相关蚊帐。
	 * POI EXCEL 默认colWidth 1023, rowHeight 255,单位未知,Anchor里坐标和colWidth, rowHeight有关。
	 * ExcelUtil方便我们将px值变为POI的坐标值或者宽高,但是会有些许误差。
	 * @author lazy_
	 *
	 */
	static class ExcelUtil{
		
		public static  int getAnchorX(int px, int colWidth){
			return (int) Math.round(( (double)701*16000.0/301)*((double)1/colWidth)*px);
		}
		
		public static int getAnchorY(int px, int rowHeight){
			return (int) Math.round(( (double)144 * 8000/301)*((double)1/rowHeight)*px);
		}
		
		public static int getRowHeight(int px){
			return (int) Math.round(((double)4480/300) * px);
		}
		
		public static int getColWidth(int px){
			return (int) Math.round(((double)10971/300) * px);
		}
	}
 

 

 

P

package com.lazyunderscore;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;

public class ExcelOperation {
	
	
	
	public static void main(String[] args) throws IOException{
		final int COL_WIDTH = 13000;
		final int ROW_HEIGHT = 5000;
		String name = "name";
		
		String remark = "remark";
		
		String period = "2013-01-01" + " ~ " + "2014-01-01";
		
		String memo = "memo";
		
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("sheet");
	    
	    for(int i=0;i<4;i++){
	    	sheet.setColumnWidth(i, 5000);
		}
	    sheet.setColumnWidth(3, COL_WIDTH);
	    
	    //header style
	    Font headerFont = wb.createFont();
	    headerFont.setBoldweight((short) 700);
	    CellStyle headerStyle = wb.createCellStyle();
	    headerStyle.setFont(headerFont);
	    headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
	    headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
	    headerStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
	    headerStyle.setBorderLeft(CellStyle.BORDER_THIN);
	    headerStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
	    headerStyle.setBorderRight(CellStyle.BORDER_THIN);
	    headerStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
	    headerStyle.setBorderTop(CellStyle.BORDER_THIN);
	    headerStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
	    
	    //th style
	    Font thFont = wb.createFont();
	    thFont.setBoldweight((short) 700);
	    CellStyle thStyle = wb.createCellStyle();
	    thStyle.setFont(headerFont);
	    thStyle.setAlignment(CellStyle.ALIGN_LEFT);
	    thStyle.setBorderBottom(CellStyle.BORDER_THIN);
	    thStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
	    thStyle.setBorderLeft(CellStyle.BORDER_THIN);
	    thStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
	    thStyle.setBorderRight(CellStyle.BORDER_THIN);
	    thStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
	    thStyle.setBorderTop(CellStyle.BORDER_THIN);
	    thStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
	    
	    //td style
	    CellStyle tdStyle = wb.createCellStyle();
	    tdStyle.setAlignment(CellStyle.ALIGN_LEFT);
	    tdStyle.setBorderBottom(CellStyle.BORDER_THIN);
	    tdStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
	    tdStyle.setBorderLeft(CellStyle.BORDER_THIN);
	    tdStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
	    tdStyle.setBorderRight(CellStyle.BORDER_THIN);
	    tdStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
	    tdStyle.setBorderTop(CellStyle.BORDER_THIN);
	    tdStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
	    
	    LinkedHashMap<String,String> voucherInfoMap = new LinkedHashMap<String,String>();
	    voucherInfoMap.put("优惠券名称", name);
	    voucherInfoMap.put("优惠券描述", remark);
	    voucherInfoMap.put("有效期	", period);
	    voucherInfoMap.put("使用说明", memo);
	    
	    //1.头部优惠券信息
	    int rowCount = 0;
	    for(Map.Entry<String, String> entry: voucherInfoMap.entrySet()){
	    	String key = entry.getKey();
	    	String value = entry.getValue();
	    	
	    	Row row = sheet.createRow(rowCount);
	 	   
		    Cell cell0 = row.createCell(0);
		    cell0.setCellValue(key);
		    cell0.setCellStyle(headerStyle);
		    
		    Cell cell1 = row.createCell(1);
		    cell1.setCellValue(value);
		    cell1.setCellStyle(headerStyle);
		    sheet.addMergedRegion(new CellRangeAddress(rowCount,rowCount,1,3));
	    	
		    row.createCell(2).setCellStyle(headerStyle);
		    row.createCell(3).setCellStyle(headerStyle);
		    
		    rowCount++;
	    }
	    //2.列表头部
	    List<String> thNames =new ArrayList<String>();
	    thNames.add("序号");
	    thNames.add("门店");
	    thNames.add("门店名称");
	    thNames.add("二维码");
	    
	    Row row = sheet.createRow(rowCount);
	    int thCellCount = 0; 
	    for(String thName : thNames){
	    	Cell cell = row.createCell(thCellCount);
	    	cell.setCellValue(thName);
	    	cell.setCellStyle(thStyle);
	    	thCellCount++;
	    }
	    rowCount++;
	    
	    //3.列表内容
	    row = sheet.createRow(rowCount);
	    
	    row.setHeight((short) ROW_HEIGHT);
	   
	    
	    CreationHelper helper = wb.getCreationHelper();
	    Drawing drawing = sheet.createDrawingPatriarch();
	    ClientAnchor anchor = helper.createClientAnchor();
	    int pictureIdx = wb.addPicture(IOUtils.toByteArray(new FileInputStream("img.png")), Workbook.PICTURE_TYPE_PNG);//一个300*300的图片
	    
	    anchor.setRow1(5);
	    anchor.setCol1(3);
	    anchor.setDx1(getAnchorX(5,COL_WIDTH));
	    anchor.setDy1(getAnchorY(5,ROW_HEIGHT));
	    
	    anchor.setRow2(5);
	    anchor.setCol2(3);
	    anchor.setDx2(getAnchorX(305,COL_WIDTH));
	    anchor.setDy2(getAnchorY(305,ROW_HEIGHT));
	    
	    drawing.createPicture(anchor, pictureIdx);
	    
	    // Write the output to a file
	    ByteArrayOutputStream bos = new ByteArrayOutputStream();
	    wb.write(bos);
	    byte[] bytes = bos.toByteArray();
	    IOUtils.copy(new ByteArrayInputStream(bytes), new FileOutputStream("workbook.xls"));
	    
	}
	private static int getAnchorX(int px, int colWidth){
		return (int) Math.round(( (double)701*16000.0/301)*((double)1/colWidth)*px);
	}
	
	private static int getAnchorY(int px, int rowHeight){
		return (int) Math.round(( (double)144 * 8000/301)*((double)1/rowHeight)*px);
	}
	
	private static int getRowHeight(int px){
		return (int) Math.round(((double)4480/300) * px);
	}
	
	private static int getColWidth(int px){
		return (int) Math.round(((double)10971/300) * px);
	}
}

 S:完整一个POI EXCEL 测试例子如下:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lazyunderscore</groupId>
  <artifactId>Word2HtmlExample</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Word2HtmlExample</name>
  <url>http://maven.apache.org</url>
  <dependencies>
  	
<!--   	<dependency> -->
<!-- 			<groupId>org.apache.poi</groupId> -->
<!-- 			<artifactId>poi-scratchpad</artifactId> -->
<!-- 			<version>3.9</version> -->
<!-- 	</dependency> -->
	<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.9</version>
		</dependency>
			<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.4</version>

		</dependency>
	
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 

分享到:
评论

相关推荐

    POI向excel中插入图片

    在本文中,我们将深入探讨如何使用POI库向Excel工作簿中插入图片。这将涵盖相关的API,步骤以及一些实用技巧。 首先,我们需要理解Excel的内部结构。在Excel文件中,图片是以OLE对象的形式存储的。POI提供了...

    通过POI将PPT插入图片并导出实例

    在这个实例中,我们将深入探讨如何利用POI库来创建一个PowerPoint演示文稿,并在其中插入图片。这个过程涉及到多个步骤,包括设置工作簿,创建幻灯片,以及添加图片到幻灯片。 首先,我们需要在项目中引入Apache ...

    POI操作Word中插入文本和图片

    在本文中,我们将深入探讨如何使用Apache POI在Word文档中插入文本和图片,这对于创建动态报告模板尤其有用。 一、Apache POI基础 Apache POI提供了一系列接口和类,用于读写微软的Office文件格式。对于Word处理,...

    Java利用poi对word插入文字图片

    本项目“Java利用poi对word插入文字图片”是一个具体的示例,旨在教给你如何使用Apache POI API在Word文档中插入文字和图片。下面将详细阐述相关的知识点。 首先,Apache POI提供了HWPF(Horrible Word Processor ...

    POI DOCX 完美文本、表格模板文字替换并实现在指定位置插入图片浮于文字上方

    - 插入图片:获取或创建`XWPFDrawing`,使用`addPicture()`方法,传入图片数据和尺寸信息。 - 设置图片浮于文字上方:调整`CTAnchor`或`CTInline`的坐标和大小属性。 7. **注意事项**: - 图片路径问题:在Java...

    java POI将图片导入word文档

    在网上看到很少POI对word文档的操作,所以自己写一些供参考,不懂的可以留言,我看到就及时回复

    POI导出Excel工具类,自动设置标题 列名 文件名,可插入图片,合并单元格

    在这个场景中,我们关注的是如何使用POI来创建一个功能丰富的Excel导出工具类,它能够自动设置标题、列名、文件名,并且支持插入图片以及合并单元格。下面将详细介绍这些功能的实现。 首先,要创建一个Excel工作簿...

    poi导入word和图片

    ### POI导入Word文档与图片的关键技术点 #### 一、概述 Apache POI 是一个用于读写 Microsoft Office 格式文件(如 .doc、.xls 和 .ppt)的 Java API。本文档将详细介绍如何使用 POI 库来读取 Word 文档(包括 ....

    解决POI3.10 添加图片不成功的问题

    解决POI3.10在添加图片的时候自身有一个BUG。纠结了很久都没解决,今天终于弄好了,文件包中附带了修改好的jar包bsj-poi-ooxml-3.10-FINAL-20140208.jar。主要问题是出在:org.apache.poi.xwpf.usermodel.XWPFRun....

    POI导出带图片的excel

    在本文中,我们将深入探讨如何使用POI库将图片插入到Excel文档中,以便创建包含图像的丰富报告。 首先,让我们理解POI的基本概念。Apache POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet ...

    java POI-lib,word中写入图片

    这段代码会在Word文档中插入一个名为"image1"的JPEG图片,图片的原始尺寸为800x600像素。记得替换`path_to_your_image.jpg`为你的图片路径,并根据实际需求调整图片大小。 在实际应用中,你可能还需要处理更多细节...

    java poi设置生成的word的图片为上下型环绕以及其位置的实现

    在使用 Java POI 库生成 Word 文档时,有时我们需要对插入的图片进行格式调整,比如设置为上下型环绕,使其在文本中占据独立空间,同时可以调整图片的位置。在默认情况下,POI 会将图片设置为嵌入型,这可能导致图片...

    poi操作word实例

    - 插入图片:首先,创建一个`XWPFPictureData pictureData = document.addPicture(data, Document.PICTURE_TYPE_JPEG, "图片名", Units.toEMU(width), Units.toEMU(height));`,然后在段落中插入图片`XWPFRun ...

    java poi 填充word(合并单元格,添加图片,设置字号)(csdn)————程序.pdf

    总结来说,这段代码展示了如何使用Java POI库创建一个动态Word文档生成器,它能够根据查询结果填充数据,合并单元格,调整文本样式,以及插入图片。这个功能对于生成报告、证书或任何需要自定义文本和图像的文档非常...

    poi获取图片位置

    poi获取图片位置,输出到指定位置

    FreeMarker+poi 模板生成word+导入图片

    5. **插入图片**: 使用POI的API在指定位置插入图片,例如`XWPFParagraph.addInlinePicture()`方法。 6. **保存生成的Word文档**: 将修改后的Word文档保存为新的文件。 **示例代码片段** ```java // FreeMarker配置 ...

    excel poi工具类 导入 导出 合并单元格 计算公式

    这个“excel poi工具类”是利用Apache POI库来实现对Excel文件进行导入、导出、合并单元格以及处理计算公式的功能。下面我们将深入探讨这些知识点。 **1. Apache POI库介绍** Apache POI是一个开源项目,它为Java...

    Apache poi 根据word模板生成word报表 替换 循环列表 图片

    3. **插入图片**:Apache POI允许我们在Word文档中插入图片。首先,你需要将图片读入内存,这可以使用InputStream实现。然后,通过创建一个XWPFPictureData对象,将图片数据添加到文档的图片数据部分。最后,在需要...

    java使用POI操作Word文档,写入文字与图片

    在这个场景下,我们将深入探讨如何使用POI库来操作Word文档,特别是写入文字和插入图片。 首先,要进行POI操作Word文档,你需要确保已经引入了相关的依赖库。在Java项目中,这通常意味着添加Apache POI的JAR包到类...

    poi word 图片 文字 目录(源码)

    使用POI 对 图片插入 目录插入 不用模板文件。 绝对好使的。

Global site tag (gtag.js) - Google Analytics