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 ;
}
}//类尾