POIUtils-联动ImageHelper

本文介绍了一个实用的Java工具类POIUtils,用于Excel文件的读写操作,包括单元格搜索、设置值、行的增删,以及利用ImageHelper类进行图片和文字水印的添加,适用于批量文档处理。

POIUtils.java POI 主要用来取出 和 导入Excel

public class POIUtils {

	private static logger logger = Logger.getLogger(POIUtils.class):

	/**为Excel打上水印工具函数
	*请自行确保参数值,以保证水印图片不会覆盖
	*在计算水印的位置的时候,并没有考虑到单元格合并的亲狂,请注意
	*wb--Excel  Workbook ; sheet --需要打水印的Excel;  byteArrayOut -- 图片流;waterRemarkWidth--水印图片宽度(l列);
	*waterRemarkHeight--水印图片高度(行)
	*/
	public static void putWaterRemarkToExcel( Workbook wb,Sheet sheet, ByteArrayOutputStream byteArrayOut,
	int waterRemarkWidth,int waterRemarkHeight) throws IOException{
			//1:开始打水印
		Drawing  drawing = sheet.createDrawingPatriarch();
		/**参数定于1-8分别是:
		* x轴的开始节点 ,y轴的开始节点,x轴的结束节点, y轴的结束节点,
		*(是从Excel的第几列插入图片,从0开始计数),
		*(是从Excel的第几行插入图片,从0开始计数),
		*  (图片宽度,共多少列),(图片高度,共多少行)
		*/
		ClientAnchor anchor = drawing.createAnchor(0,0,1023,255,0,0,waterRemarkWidth,waterRemarkHeight);//1024列,256行
        Picture  pic = drawing.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(),Workbook.PICTURE_TYPE_PNG) );
		pic.resize();
	}
	//2:水印
	public static void waterPrint(HSSFWorkbook workbook ,HSSFSheet sheet,List<String> stringList)throws IOException{
		ByteArrayOutputStream os = ImageHelper.textMark(
		stringList,new Font("宋体",Font.BOLD| Font.LAYOUT_LEFT_TO_RIGHT,32),Color.gray,(float)0.2,sheet.getLastRowNum()
		);
		putWaterRemarkToExcel( workbook,sheet,os,10,sheet.getLastRowNum());
	}
	//3:通过值获取 单元格cell
	pulbic static org.apache.poi.hssf.usermodel.HSSFCell getCellByValue(HSSFSheet sheet,String value){
				for( int rowIdx = 0; rowIdx < 10; rowIdx ++){
						HSSFRow row = sheet.getRow(rowIdx);
							for(int colIdx = 0; colIdx < 100 ; colIdx ++){
								try{
									HSSFCell cell = row.getCell(colIdx);
									if( cell == null ) break;
									if( value.equals(cell.getStringCellValue()) ){return cell;}
								}catch(Exception e){
									 break;
								}
							}
				}
				return null;
	}
//4:设值 --单个设值
public static void setValue(HSSFSheet sheet , String name ,Object value ){
 		if(value == null) return ;
		//遍历每一行
		for(int rowIdx = 0 ;rowIdx < 100 ; rowIdx ++ ){
			HSSFRow row = sheet.getRow(rowIdx); //得到每一行
			//遍历当前行中的每一列
			for( int colIdx = 0 ;colIdx < 100; colIdx ++){
					HSSFCell cell = row.getCell(colIdx);//得到每一个单元格
							if( cell != null ){
								 String  val = cell.getStringCellValue();//格式为:val = [xxx]
								 if(String.format("[%s]",name).equals(val)){ //相等
										if(value instanceof Double)
											cell.setCellValue( (Double)val );
										else
											cell.setCellValue( value.toString() );
									}else{            //不等于
											cell.setCellValue(val.replaceAll( String.format("[%s]",name),value.toString()));
									}
							}
			}
		}
}
//5:设值--用集合中的值
public  static void setValue(HSSFSheet sheet , List<Map<String ,String>> mapLsit,String name ){
			for(int rowIdx = 0 ;rowIdx < 100 ; rowIdx ++ ){
			HSSFRow row = sheet.getRow(rowIdx); //得到每一行
			//遍历当前行中的每一列
			for( int colIdx = 0 ;colIdx < 100; colIdx ++){
					HSSFCell cell = row.getCell(colIdx);//得到每一个单元格
							if( cell != null ){
								 String  val = cell.getStringCellValue();//格式为:val = [xxx]
								 String repVal = " ";
									 if( mapList.size() > 0 ){
									repVal  = mapList.get(0).get(name);
									if( repVal == null ){ repVal = " ";}
									}
								 cell.setCellValue( val.replaceAll( String.format("[%s]",name), repVal  );			
							}
			}
}
//6:增加行
public static HSSFRow createRow( HSSFSheet sheet ,int rowIndex){
	HSSFRow row = null ;
		if( sheet.getRow(rowIndex) != null ){
			 int lastRowNo = sheet.getLastRowNum();//得到最后一行的行号
			 sheet.shiftRows(rowIndex,lastRowNo , 1);
		}
	row = sheet.createRow(rowIndex);
	return row;
}
//7:删除指定行
public static void deleteRow(HSSFSheet sheet, int rowIndex){
	HSSFRow row = null ;
		if (sheet.getRow(rowIndex) != null) {
			int lastRowNo = sheet.getLastRowNum();
			sheet.shiftRows(rowIndex,lastRowNo,-1); //删除一行,最后一行的行号要减1
		}
}

}//类尾

-----ImageHelper.java

public class ImageHelper{

/**1:生成缩略图  保存: ImageIO.write(  BufferedImage,imgType[jpg/png/...],File    );
*source:原图片  width: 缩略图宽  height:缩略图高   b 是否等比缩放
*/
public static BufferedImage Thumb( BufferedImage  source ,int width, int height,boolean b  ){
	//targetW ,targetH 分别表示目标长度和宽度
	int type = source.getType();
	BufferedImage  target = null ;
	double  sx = (double) width/source.getWidth();
	double  sy = (double) height/source.getHeight();
	if( b ) { 
			if(sx>sy) {
			sx = sy;
			width = (int) (sx * source.getWidth());
			}else{
			sy = sx;
			height = (int) (sy * source.getHeight());
			}
	}
	if ( type == BufferedImage.TYPE_CUSTOM  ) {  //handmade
			ColorModel cm = source.getColorModel();
			WritableRaster raster = cm.createCompatibleWritableRaster( width , height );
			boolean alphaPremultiplied = cm.isAlphaPremultiplied();
			target = new BufferedImage( cm ,raster, alphaPremultiplied ,null);
	} else   target = new BufferedImage( width , height , type  );
		Graphics2D g = target.createGraphics();
		//smoother than exlax
		g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
		g.drawRenderedImage( source, AffineTransform.getScaleInstance(sx,sy) );
		g.dispose();
		return target;
}//1方法尾
//2:图片水印
/**imgPath----待处理图片   markPath----水印图片   x--水印位于图片左上角的x 坐标值  y--水印位于图片左上角的y 
*alpha 水印透明度 0.1f-1.0f
*/
public static void waterMark(){
		//1:加载待处理图片文件
		Image img  =  ImageIO.read( new File (imgPath) );
		BufferedImage image = new BufferedImage( img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
		Graphics2D g = image.createGraphics();
		g.drawImage( img , 0, 0, null);
		//2:加载水印图片文件
		Image src_biao = ImageIO.read( new File (markPath));
		g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP,alpha));
		g.drawImage(src_biao,x,y,null);
		g.dispose();
		//保存处理后的文件
		FileOutputStream out  =  new FileOutputStream( imgPath );
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(image);
		out.close();
}
//3:文字水印
/**imgPath-- 待处理图片  text--水印文字  font--水印字体信息  color---水印字体颜色  
*  x--水印位于图片左上角的x 坐标值   y--水印位于图片左上角的y     alpha--水印透明度0.1f-1.0f
*/
public static void textMark( String imgPath,String text,Font font,Color color,int x,int y,float alpha){
		Font Dfont = (font == null ) ? new Font("宋体",20,13) :font;
		//1:加载待处理图片文件
		Image img  =  ImageIO.read( new File (imgPath) );
		BufferedImage image = new BufferedImage( img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
		Graphics2D g = image.createGraphics();
		g.drawImage( img , 0, 0, null);
		g.setColor(color);
		g.setFont(Dfont);
		g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP,alpha));
		g.drawString(text,x,y);
		g.dispose();
		FileOutputStream out  =  new FileOutputStream( imgPath );
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(image);
		out.close();
}
//4:这个就是联动的用到了,但是我真的看不懂哇
public static ByteArrayOutputStream textMark(List<String> stringList, Font font ,Color color,float alpha, int rowNum) throws IOException{
	Font Dfont = (font == null ) ? new Font("宋体",20,13) :font;
	BufferedImage image = new BufferedImage(1000 , 33*rowNum ,BufferedImage.TYPE_INT_ARGB);
	Graphics2D g = image.createGraphics();
	g.setColor(color);
	g.setFont(Dfont);
	g.translate(image.getWidth(), -image.geHeight());
	g.rotate(45);
	g.setComposite(AlphaComposite.getInstance( AlphaComposite.DST_ATOP,alpha));
	int y = 0;
	double maxx = Math.sqrt(   (image.getWidth()*image.getWidth()) +(image.getHeight()*image.getHeight())  );
	double maxy = Math.sqrt( ( (image.getWidth()+imae.getHeight())*(image.getWidth()+imae.getHeight())  )/2 )
	+Math.sqrt( (image.getHeight()*image.getHeight()) /2);
	while(y < maxy){
			for(String text : stringList){
				int x = 0 ;
				while(x < maxx ){ 
				g.drawString(text,x,y);
				x= (int)Math.rint(x +(maxx/2));
				}
				y = y + 100;
			}
	}
	g.setComposite(AlphaComposite.getInstance( AlphaComposite.DST_OVER));
	g.dispose();
	ByteArrayOutputStream byteArrayOut =  new ByteArrayOutputStream ();
	ImageIO.write(image , "png", byteArrayOut);
	return byteArrayOut ;
}

}//类尾
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值