后台生成图片放入EXCEL的问题

时间:2022-08-25 16:13:35
我现在要做一个用Java生成一个条码,然后放入EXCEL供客户打印。现在的做法是用OutputStream生成至磁盘上面,然后在生成EXCEL的时候读取这个图片文件。请问有没有方法可以不在磁盘产生文件而是直接将生成的图片文件传至EXCEL打印?

10 个解决方案

#1


没人知道么?

#3


引用 2 楼  的回复:
http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。

#4


引用 3 楼  的回复:
引用 2 楼 的回复:

http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。


那你的图片存在哪里???

#5


poi就可以

#6


引用 4 楼  的回复:
引用 3 楼  的回复:
引用 2 楼 的回复:

http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。


那你的图片存在哪里???


如果不能直接传过去我想看看能不能放缓存里面,总之觉得生成到服务器,然后打印完EXCEL之后又得删掉太麻烦了

#7


引用 5 楼  的回复:
poi就可以


POI是处理EXCEL的,但是我现在的关键是要如何生成图片不在本地产生记录直接传入EXCEL打印

#8


如果你的图片是固定的空调将它放在你的项目目录中然后通过
request.getSession().getServletContext().getRealPath("")+"/image/image.png"

#9


引用 8 楼  的回复:
如果你的图片是固定的空调将它放在你的项目目录中然后通过
HTML code
request.getSession().getServletContext().getRealPath("")+"/image/image.png"


我想你还没理解我的意思。我的图片是用java生成的条形码,现在需要直接传到EXCEL里面导出进行打印。所以该图片是没有固定空间的,打印完之后也没有存在的必要了。所以该图片从生成到销毁整个过程存在不会超过5秒。

#10



public static void main(String[] args) {

FileOutputStream fileOut = null;

try {

// 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

ImageIO.write(Test.createImage(), "jpg", byteArrayOut);

// 创建一个工作薄
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("d:/test.xls"));

HSSFSheet sheet1 = wb.getSheetAt(0);

HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
//HSSFClientAnchor几个数字解释:3:是x轴的开始节点, 0: 是y轴的开始节点,1023:是x轴的结束节点,255:是y轴的结束节点,1:是从Excel的2列开始插入图片,10:是从excel的第11行开始插入图片, 11:图片占用11列的位置,25:图片结束在excel的26行
HSSFClientAnchor anchor = new HSSFClientAnchor(3, 0, 1023, 255,(short) 1, 10,(short) 11, 25);

anchor.setAnchorType(2);

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

fileOut = new FileOutputStream("d:/workbook.xls");

// 写入excel文件
wb.write(fileOut);

fileOut.close();

} catch (IOException io) {

io.printStackTrace();

System.out.println("io erorr :  " + io.getMessage());

} finally {

if (fileOut != null) {

try {

fileOut.close();

} catch (IOException e) {

e.printStackTrace();

}
}
}
}

public static BufferedImage createImage(){

   int width = 100;
   
   int height = 100;
   
   String s = "你好";
   
   Font font = new Font("Serif", Font.BOLD, 10);
   
   BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   
   Graphics2D g2 = (Graphics2D)bi.getGraphics();
   
   g2.setBackground(Color.WHITE);
   
   g2.clearRect(0, 0, width, height);
   
   g2.setPaint(new Color(0,0,255)); 
   
   g2.fillRect(0, 0, 100, 10);
   
   g2.setPaint(new Color(253,2,0));
   
   g2.fillRect(0, 10, 100, 10);
   
   g2.setPaint(Color.red);
   
   FontRenderContext context = g2.getFontRenderContext();
   
   Rectangle2D bounds = font.getStringBounds(s, context);
   
   double x = (width - bounds.getWidth()) / 2; 
   
   double y = (height - bounds.getHeight()) / 2; 
   
   double ascent = -bounds.getY();
   
   double baseY = y + ascent;
   
   g2.drawString(s, (int)x, (int)baseY);
   
   return bi;
   
}  


试试我这个行不

#1


没人知道么?

#2


#3


引用 2 楼  的回复:
http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。

#4


引用 3 楼  的回复:
引用 2 楼 的回复:

http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。


那你的图片存在哪里???

#5


poi就可以

#6


引用 4 楼  的回复:
引用 3 楼  的回复:
引用 2 楼 的回复:

http://blog.csdn.net/huiwenjie168/article/details/7617379看看我这里


你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。


那你的图片存在哪里???


如果不能直接传过去我想看看能不能放缓存里面,总之觉得生成到服务器,然后打印完EXCEL之后又得删掉太麻烦了

#7


引用 5 楼  的回复:
poi就可以


POI是处理EXCEL的,但是我现在的关键是要如何生成图片不在本地产生记录直接传入EXCEL打印

#8


如果你的图片是固定的空调将它放在你的项目目录中然后通过
request.getSession().getServletContext().getRealPath("")+"/image/image.png"

#9


引用 8 楼  的回复:
如果你的图片是固定的空调将它放在你的项目目录中然后通过
HTML code
request.getSession().getServletContext().getRealPath("")+"/image/image.png"


我想你还没理解我的意思。我的图片是用java生成的条形码,现在需要直接传到EXCEL里面导出进行打印。所以该图片是没有固定空间的,打印完之后也没有存在的必要了。所以该图片从生成到销毁整个过程存在不会超过5秒。

#10



public static void main(String[] args) {

FileOutputStream fileOut = null;

try {

// 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

ImageIO.write(Test.createImage(), "jpg", byteArrayOut);

// 创建一个工作薄
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("d:/test.xls"));

HSSFSheet sheet1 = wb.getSheetAt(0);

HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
//HSSFClientAnchor几个数字解释:3:是x轴的开始节点, 0: 是y轴的开始节点,1023:是x轴的结束节点,255:是y轴的结束节点,1:是从Excel的2列开始插入图片,10:是从excel的第11行开始插入图片, 11:图片占用11列的位置,25:图片结束在excel的26行
HSSFClientAnchor anchor = new HSSFClientAnchor(3, 0, 1023, 255,(short) 1, 10,(short) 11, 25);

anchor.setAnchorType(2);

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

fileOut = new FileOutputStream("d:/workbook.xls");

// 写入excel文件
wb.write(fileOut);

fileOut.close();

} catch (IOException io) {

io.printStackTrace();

System.out.println("io erorr :  " + io.getMessage());

} finally {

if (fileOut != null) {

try {

fileOut.close();

} catch (IOException e) {

e.printStackTrace();

}
}
}
}

public static BufferedImage createImage(){

   int width = 100;
   
   int height = 100;
   
   String s = "你好";
   
   Font font = new Font("Serif", Font.BOLD, 10);
   
   BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   
   Graphics2D g2 = (Graphics2D)bi.getGraphics();
   
   g2.setBackground(Color.WHITE);
   
   g2.clearRect(0, 0, width, height);
   
   g2.setPaint(new Color(0,0,255)); 
   
   g2.fillRect(0, 0, 100, 10);
   
   g2.setPaint(new Color(253,2,0));
   
   g2.fillRect(0, 10, 100, 10);
   
   g2.setPaint(Color.red);
   
   FontRenderContext context = g2.getFontRenderContext();
   
   Rectangle2D bounds = font.getStringBounds(s, context);
   
   double x = (width - bounds.getWidth()) / 2; 
   
   double y = (height - bounds.getHeight()) / 2; 
   
   double ascent = -bounds.getY();
   
   double baseY = y + ascent;
   
   g2.drawString(s, (int)x, (int)baseY);
   
   return bi;
   
}  


试试我这个行不