我现在要做一个用Java生成一个条码,然后放入EXCEL供客户打印。现在的做法是用OutputStream生成至磁盘上面,然后在生成EXCEL的时候读取这个图片文件。请问有没有方法可以不在磁盘产生文件而是直接将生成的图片文件传至EXCEL打印?
解决方案 »
- java web 程序员能走多远??? 该向哪方面发展???请高人指点
- 【求助】System.out什么时候被初始化的?
- SSH整合的问题,大家帮忙看看
- Hibernate Annotation 和 Spring 的初级问题 (穷人提问,没有奖励分,只有诚挚的感谢!)
- dom4j获取xml属性后想根据获取的属性新键类
- java调用存储过程的问题!datetime参数的传递
- hibernate调用存储过程的问题
- java在方法中能否在定义个方法?
- 请问在struts中怎么上传文件?急啊!
- 在Tomcat + Oracle中的中文乱码问题????
- 关于Servlet路径问题
- ActiveMQ和数据库
你这个也是先在磁盘有图片然后去读取的,我现在需要产生图片不在磁盘产生记录直接传至生成的EXCEL然后打印出来。
如果不能直接传过去我想看看能不能放缓存里面,总之觉得生成到服务器,然后打印完EXCEL之后又得删掉太麻烦了
POI是处理EXCEL的,但是我现在的关键是要如何生成图片不在本地产生记录直接传入EXCEL打印
request.getSession().getServletContext().getRealPath("")+"/image/image.png"
我想你还没理解我的意思。我的图片是用java生成的条形码,现在需要直接传到EXCEL里面导出进行打印。所以该图片是没有固定空间的,打印完之后也没有存在的必要了。所以该图片从生成到销毁整个过程存在不会超过5秒。
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;
}
试试我这个行不