精华内容
下载资源
问答
  • java操作excel实现水印图片
  • java导出excel水印且加密(已实现)

    千次阅读 2021-01-18 15:55:02
    水印是以图片形式加在excel上的,介意的不需要往下看了. 加密是真正的加密. 水印效果图: 密码效果图: 废话不多说,直接上代码: package com.cpic.excelWater; import org.apache.poi.hssf.usermodel.HSSFWorkbook;...

    水印是以图片形式加在excel上的,介意的不需要往下看了.
    加密是真正的加密.

    水印效果图:
    在这里插入图片描述
    密码效果图:
    在这里插入图片描述

    废话不多说,直接上代码:

    package com.cpic.excelWater;
    
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.*;
    
    
    public class ExcelWaterRemarkUtils {
        /*
         * 为Excel打上水印工具函数 请自行确保参数值,以保证水印图片之间不会覆盖。 在计算水印的位置的时候,并没有考虑到单元格合并的情况,请注意
         *
         * @param wb
         *            Excel Workbook
         * @param sheet
         *            需要打水印的Excel
         * @param waterRemarkPath
         *            水印地址,classPath,目前只支持png格式的图片,
         *            因为非png格式的图片打到Excel上后可能会有图片变红的问题,且不容易做出透明效果。
         *            同时请注意传入的地址格式,应该为类似:"\\excelTemplate\\test.png"
         * @param startXCol
         *            水印起始列
         * @param startYRow
         *            水印起始行
         * @param betweenXCol
         *            水印横向之间间隔多少列
         * @param betweenYRow
         *            水印纵向之间间隔多少行
         * @param XCount
         *            横向共有水印多少个
         * @param YCount
         *            纵向共有水印多少个
         * @param waterRemarkWidth
         *            水印图片宽度为多少列
         * @param waterRemarkHeight
         *            水印图片高度为多少行
         * @throws IOException
         */
        public static void putWaterRemarkToExcel(Workbook wb, Sheet sheet, String waterRemarkPath, int startXCol,
                                                 int startYRow, int betweenXCol, int betweenYRow, int XCount, int YCount, int waterRemarkWidth,
                                                 int waterRemarkHeight) throws IOException {
    
            // 加载图片
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            BufferedImage bufferImg = ImageUtils.createWaterMark("xxx");
            ImageIO.write(bufferImg, "png", byteArrayOut);
            // 开始打水印
            Drawing drawing = sheet.createDrawingPatriarch();
            Drawing<?> drawingPatriarch = sheet.getDrawingPatriarch();
            // 按照共需打印多少行水印进行循环
            for (int yCount = 0; yCount < YCount; yCount++) {
                // 按照每行需要打印多少个水印进行循环
                for (int xCount = 0; xCount < XCount; xCount++) {
                    // 创建水印图片位置
                    int xIndexInteger = startXCol + (xCount * waterRemarkWidth) + (xCount * betweenXCol);
                    int yIndexInteger = startYRow + (yCount * waterRemarkHeight) + (yCount * betweenYRow);
                    /*
                     * 参数定义: 第一个参数是(x轴的开始节点); 第二个参数是(是y轴的开始节点); 第三个参数是(是x轴的结束节点);
                     * 第四个参数是(是y轴的结束节点); 第五个参数是(是从Excel的第几列开始插入图片,从0开始计数);
                     * 第六个参数是(是从excel的第几行开始插入图片,从0开始计数); 第七个参数是(图片宽度,共多少列);
                     * 第8个参数是(图片高度,共多少行);
                     */
                    ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, xIndexInteger,
                            yIndexInteger, xIndexInteger + waterRemarkWidth, yIndexInteger + waterRemarkHeight);
    
                    Picture pic = drawing.createPicture(anchor,
                            wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG));
                    pic.resize();
                }
            }
        }
    
        public static final String inFilePath = "D:\\xxx.xlsx";
    
        public static void main(String[] args) {
    
            try {
                //读取excel文件
                Workbook wb =null;
                if (inFilePath.endsWith("xls")) {
                    wb = new HSSFWorkbook(new FileInputStream(inFilePath));
                }else if (inFilePath.endsWith("xlsx")){
                    wb = new XSSFWorkbook(new FileInputStream(inFilePath));
                }
                //获取excel sheet个数
                int sheets = wb.getNumberOfSheets();
                //循环sheet给每个sheet添加水印
                for (int i = 0; i < sheets; i++) {
                    Sheet sheet = wb.getSheetAt(i);
                    //获取excel实际所占行
                    int row = sheet.getFirstRowNum() + sheet.getLastRowNum();
                    //获取excel实际所占列
                    Row row1 = sheet.getRow(sheet.getFirstRowNum());
                    if (row1==null){
                        continue;
                    }
                    int cell = sheet.getRow(sheet.getFirstRowNum()).getLastCellNum() + 1;
                    //根据行与列计算实际所需多少水印
                    ExcelWaterRemarkUtils.putWaterRemarkToExcel(wb, sheet, null, 0, 0, 15, 15, cell / 15 + 1, row / 15 + 1, 0, 0);
    
                    sheet.protectSheet("xxx");
                }
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                try {
                    wb.write(os);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                wb.close();
                byte[] content = os.toByteArray();
                // Excel文件生成后存储的位置。
                File file1 = new File(inFilePath);
                OutputStream fos = null;
                try {
                    fos = new FileOutputStream(file1);
                    fos.write(content);
                    os.close();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
    
    
    
    
    

    下面是个utils:

    package com.cpic.excelWater;
    
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.font.FontRenderContext;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class ImageUtils {
    
    
        public static BufferedImage createWaterMark(String content) {
            Integer width = 300;
            Integer height = 200;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象
            String fontType = "宋体";
            Integer fontStyle = Font.PLAIN;
            Integer fontSize = 50;
            Font font = new Font(fontType, fontStyle, fontSize);
            Graphics2D g2d = image.createGraphics(); // 获取Graphics2d对象
            image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            g2d.dispose();
            g2d = image.createGraphics();
            g2d.setColor(new Color(0, 0, 0, 80)); //设置字体颜色和透明度
            g2d.setStroke(new BasicStroke(1)); // 设置字体
            g2d.setFont(font); // 设置字体类型  加粗 大小
            g2d.rotate(Math.toRadians(-10), (double) image.getWidth() / 2, (double) image.getHeight() / 2);//设置倾斜度
            FontRenderContext context = g2d.getFontRenderContext();
            Rectangle2D bounds = font.getStringBounds(content, context);
            double x = (width - bounds.getWidth()) / 2;
            double y = (height - bounds.getHeight()) / 2;
            double ascent = -bounds.getY();
            double baseY = y + ascent;
            // 写入水印文字原定高度过小,所以累计写水印,增加高度
            g2d.drawString(content, (int) x, (int) baseY);
            // 设置透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            // 释放对象
            g2d.dispose();
            return image;
        }
    
        public static void createWaterMark(String content, String path) throws IOException {
            Integer width = 300;
            Integer height = 200;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象
            String fontType = "宋体";
            Integer fontStyle = Font.PLAIN;
            Integer fontSize = 50;
            Font font = new Font(fontType, fontStyle, fontSize);
            Graphics2D g2d = image.createGraphics(); // 获取Graphics2d对象
            image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            g2d.dispose();
            g2d = image.createGraphics();
            g2d.setColor(new Color(0, 0, 0, 80)); //设置字体颜色和透明度
            g2d.setStroke(new BasicStroke(1)); // 设置字体
            g2d.setFont(font); // 设置字体类型  加粗 大小
            g2d.rotate(Math.toRadians(-10), (double) image.getWidth() / 2, (double) image.getHeight() / 2);//设置倾斜度
            FontRenderContext context = g2d.getFontRenderContext();
            Rectangle2D bounds = font.getStringBounds(content, context);
            double x = (width - bounds.getWidth()) / 2;
            double y = (height - bounds.getHeight()) / 2;
            double ascent = -bounds.getY();
            double baseY = y + ascent;
            // 写入水印文字原定高度过小,所以累计写水印,增加高度
            g2d.drawString(content, (int) x, (int) baseY);
            // 设置透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            // 释放对象
            g2d.dispose();
            ImageIO.write(image, "png", new File(path));
        }
    
    }
    
    

    加油吧 少年 奥利给

    展开全文
  • excel导出添加水印

    2018-08-02 17:31:31
    java通过POI组件可以给导出的excel表格添加水印,不需要额外的组件
  • java实现动态水印.zip

    2020-06-23 16:34:46
    主要用于实现excel下载时添加动态水印功能,附件包含了添加水印的核心方法和所需jar包,jar包是修改过源码后可用的jar包
  • java 通过JXL架包,给excel文件添加水印水印内容可自定义
  • 上篇介绍了Java使用poi操作excel表格的导入和修改,在日常开发中经常也会遇到在页面上点击按钮将数据库中的数据导出到excel表中; 今天我就遇到这么一个需求:根据条件将查询到的数据导出到Excel表格中要支持xls/...

    上篇 这么优秀的Excel工具类,你难道不用?介绍了Java使用poi操作excel表格的导入和修改,在日常开发中经常也会遇到在页面上点击按钮将数据库中的数据导出到excel表中;

    今天我就遇到这么一个需求:根据条件将查询到的数据导出到Excel表格中要支持xls/xlsx两种不同类型的excel文件,携带水印效果,并且每个人导出时水印要不同。

    (听听听听,这说的是人话吗… )

    在了解Excel的水印其实就是插入艺术字再修改字体的颜色、字体、透明度就变成了所谓的水印效果了(一顿操作后我发现其实就类似插入一张透明文字图片);

    思路:

    根据对Excel的了解及上网查阅了几篇文章后,整理出了思路。

    在对Excel完成数据的写入后,可以生成一张类似的透明文字图片,再将该图片插入到Excel表格中,就形成了水印的效果;

    来人,上代码!!!

    接口请求控制层:

    @RestController
    @RequestMapping("v1/perFee")
    public class PerFeeController {@GetMapping("/expirApplyedList")
        public void expirApplyedList(HttpServletResponse response,@RequestParam(required = false) Integer status, @RequestParam(required = false) String name,
                                  @RequestParam(required = false) String idNumber, @RequestParam(required = false) String phone ,
                                  @RequestParam(required = false) String exhId,@RequestParam(required = true) String filePath
        ) {
    ​
            PerFee perFee=new PerFee();
            perFee.setStatus(status);
            perFee.setName(name);
            perFee.setPhone(phone);
            perFee.setIdNumber(idNumber);
            perFee.setExhId(exhId);
    ​
            List<PerFee> perFeeList=perFeeService.applyedList(perFee);//excel标题
            String[] title = {"报销编号","报销人", "实际报销金额","状态"};//excel文件名
            String fileName = "报销费用审核_" + System.currentTimeMillis() + "." + filePath;
            //sheet名
            String sheetName = "报销费用审核";
    ​
            String [][] content = new String[perFeeList.size()][title.length];
            for (int i = 0,size=perFeeList.size();i < size; i++) {
                //content[i] = new Stri ng[title.length];
                PerFee obj = perFeeList.get(i);
                content[i][0] = String.valueOf(i+1);
                content[i][1] = obj.getName();
                content[i][2] = obj.getAccount();
                Integer status1 = obj.getStatus();
                String stat = "";
                if (status1 == 1) {
                    stat = "财务审核中";
                }else if (status1 == 2) {
                    stat = "已通过审核";
                }
                content[i][3] = stat;
            }//创建HSSFWorkbook
            Workbook wb = ExcelUtils.expirWorkbook(sheetName, title, content, createWorkbook(filePath));//响应到客户端
            OutputStream os = null;
            try {
                try {
                    fileName = new String(fileName.getBytes(), "ISO8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                response.setContentType("application/octet-stream;charset=ISO8859-1");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
                response.addHeader("Pargam", "no-cache");
                response.addHeader("Cache-Control", "no-cache");
    ​
                 os = response.getOutputStream();
                wb.write(os);
                os.flush();
            } catch (Exception ex) {
                ex.printStackTrace();
            }finally {
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }/**
         * 根据文件格式创建Workbook
         * @param filePath
         * @return
         */
        private static Workbook createWorkbook(String filePath) {
            Workbook wb = null;
            try {
                //如果文件后缀名为xls
                if ("xls".equals(filePath)) {
                    wb = new HSSFWorkbook();
                }//如果文件后缀名为xlsx
                else if ("xlsx".equals(filePath)) {
                    wb = new XSSFWorkbook();
                } else {
                    wb = null;
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
            return wb;
        }}
    

    ExcelUtils工具类:

    public class ExcelUtils{/**
         * 导出Excel
         * @param sheetName sheet名称
         * @param title 标题(列头)
         * @param values 内容
         * @param wb Workbook对象  工作簿
         * @return
         */
        public static Workbook expirWorkbook(String sheetName, String []title, String [][]values, Workbook wb){// 第一步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
            //设置列宽
            sheet.setColumnWidth(2,256*19+184);
            sheet.setColumnWidth(3,256*12+184);
            //sheet.setColumnWidth(4,256*20+184);//设置工作簿保护模式,只读不可修改。使用UUID获取随机值作为密码
            sheet.protectSheet(UUID.randomUUID().toString());// 第二步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);// 第三步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            //style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式//声明列对象
            Cell cell = null;//创建标题
            for(int i=0;i<title.length;i++){
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }//创建内容
            for(int i=0;i<values.length;i++){
                row = sheet.createRow(i + 1);
                for(int j=0;j<values[i].length;j++){
                    //将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(values[i][j]);
                }
            }//给Excel设置水印
            painWaterMark(wb,sheet,"I Love You");return wb;
        }/**
         * 给Excel添加水印
         * @param wb 工作簿
         * @param sheet  sheet页
         * @param content 水印内容
         */
        private static void painWaterMark(Workbook wb,Sheet sheet,String content) {
            String imgFileName = "waterMark_photo_"+content+".png";
            //创建水印图片  (默认保存到classes目录下)
            createWaterMark(content,imgFileName);//将图片写入到excel中
            try {//也可以动态获取sheet中的行和列,根据行和列适当的放置水印图片
                //获取excel实际所占行
                //int row = sheet.getFirstRowNum() + sheet.getLastRowNum();
                //获取excel实际所占列
                //int cell = sheet.getRow(sheet.getFirstRowNum()).getLastCellNum() + 1;putWaterRemarkToExcel(wb, sheet, imgFileName, 0, 0, 5, 5,2, 10, 2, 2);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }/**
         * 创建水印图片
         * 注意:生成的图片会默认保存到classes目录下,可以根据自己的业务进行更改
         * @param content
         * @param fileName
         * @return
         * @throws IOException
         */
        private static String createWaterMark(String content, String fileName) {
        	//生成水印图片的宽度
            Integer width = 300;
       		//水印图片的高度
            Integer height = 150;
            // 获取bufferedImage对象
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            String fontType = "宋体";
            Integer fontStyle = java.awt.Font.PLAIN;
            Integer fontSize = 50;
            java.awt.Font font = new java.awt.Font(fontType, fontStyle, fontSize);
            // 获取Graphics2d对象
            Graphics2D g2d = image.createGraphics();
            image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            g2d.dispose();
            g2d = image.createGraphics();
            g2d.setColor(new java.awt.Color(0, 0, 0, 80)); //设置字体颜色和透明度
            // 设置字体
            g2d.setStroke(new BasicStroke(1));
            // 设置字体类型  加粗 大小
            g2d.setFont(font);
            //设置倾斜度
            g2d.rotate(Math.toRadians(-10), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
            FontRenderContext context = g2d.getFontRenderContext();
            Rectangle2D bounds = font.getStringBounds(content, context);
            double x = (width - bounds.getWidth()) / 2;
            double y = (height - bounds.getHeight()) / 2;
            double ascent = -bounds.getY();
            double baseY = y + ascent;
            // 写入水印文字原定高度过小,所以累计写水印,增加高度
            g2d.drawString(content, (int) x, (int) baseY);
            // 设置透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            // 释放对象
            g2d.dispose();
            String targetImagePath = Thread.currentThread().getContextClassLoader().getResource("").getPath()+fileName;
            try {
                ImageIO.write(image, "png", new File(targetImagePath));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return targetImagePath;
        }/**
         * 为Excel打上水印工具函数 请自行确保参数值,以保证水印图片之间不会覆盖。在计算水印的位置的时候,并没有考虑到单元格合并的情况,请注意
         * @param wb Excel Workbook
         * @param sheet 需要打水印的Excel
         * @param waterRemarkPath 水印地址,classPath,目前只支持png格式的图片,
         *                        因为非png格式的图片打到Excel上后可能会有图片变红的问题,且不容易做出透明效果。
         *                        同时请注意传入的地址格式,应该为类似:"\\excelTemplate\\test.png"
         * @param startXCol 水印起始列
         * @param startYRow 水印起始行
         * @param betweenXCol 水印横向之间间隔多少列
         * @param betweenYRow 水印纵向之间间隔多少行
         * @param XCount 横向共有水印多少个
         * @param YCount 纵向共有水印多少个
         * @param waterRemarkWidth 水印图片宽度为多少列
         * @param waterRemarkHeight 水印图片高度为多少行
         * @throws IOException
         */
        private static void putWaterRemarkToExcel(Workbook wb, Sheet sheet, String waterRemarkPath, int startXCol,
                                                 int startYRow, int betweenXCol, int betweenYRow, int XCount, int YCount, int waterRemarkWidth,
                                                 int waterRemarkHeight) throws IOException {// 校验传入的水印图片格式
            if (!waterRemarkPath.endsWith("png") && !waterRemarkPath.endsWith("PNG")) {
                throw new RuntimeException("向Excel上面打印水印,目前支持png格式的图片。");
            }
            // 加载图片
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            //InputStream imageIn = new FileInputStream(waterRemarkPath);
            InputStream imageIn = Thread.currentThread().getContextClassLoader().getResourceAsStream(waterRemarkPath);
            if (null == imageIn || imageIn.available() < 1) {
                throw new RuntimeException("向Excel上面打印水印,读取水印图片失败(1)。");
            }
            BufferedImage bufferImg = ImageIO.read(imageIn);
            if (null == bufferImg) {
                throw new RuntimeException("向Excel上面打印水印,读取水印图片失败(2)。");
            }
            ImageIO.write(bufferImg, "png", byteArrayOut);// 开始打水印
            Drawing drawing = sheet.createDrawingPatriarch();// 按照共需打印多少行水印进行循环
            for (int yCount = 0; yCount < YCount; yCount++) {
                // 按照每行需要打印多少个水印进行循环
                for (int xCount = 0; xCount < XCount; xCount++) {
                    // 创建水印图片位置
                    int xIndexInteger = startXCol + (xCount * waterRemarkWidth) + (xCount * betweenXCol);
                    int yIndexInteger = startYRow + (yCount * waterRemarkHeight) + (yCount * betweenYRow);/** 参数定义:第一个参数是(x轴的开始节点);第二个参数是(是y轴的开始节点);第三个参数是(是x轴的结束节点);
                     * 第四个参数是(是y轴的结束节点);第五个参数是(是从Excel的第几列开始插入图片,从0开始计数);
                     * 第六个参数是(是从excel的第几行开始插入图片,从0开始计数);第七个参数是(图片宽度,共多少列);
                     * 第8个参数是(图片高度,共多少行);*/
    ​
                    ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, xIndexInteger,
                            yIndexInteger, xIndexInteger + waterRemarkWidth, yIndexInteger + waterRemarkHeight);
    ​
                    Picture pic = drawing.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG));
                    pic.resize();
                }
            }
        }}
    

    以上代码亲测有效,可以直接复制下来根据业务修改部分代码进行测试。

    效果:
    在这里插入图片描述
    在这里插入图片描述

    怎么样?看起来是不是和正常水印一样的效果!ᥬ᭄


    公众号:沉默木头人

    CSDN:沉默木头人(ID:qq_44322555)

    喜欢感兴趣长按下面二维码关注吧!
    在这里插入图片描述

    原创不易,不喜勿喷,如果能够帮助到你或对你有所启发欢迎下方留言。

    喜欢就开始你无情的三连击:点赞、分享、关注。这将是我写作更多有趣有益有知的好文章的动力;

    展开全文
  • 主要利用free spire.office for java 为word,ppt,pdf 文档添加文本水印。利用poi 给excel文档添加文本水印。所需要的包在lib文件夹下
  • JavaExcel中添加水印

    2021-03-23 14:53:40
    Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果。本文通过Java程序代码介绍具体实现方法。 程序环境: 测试文档:Office Excel 2013 编译环境:IntelliJ IDEA 2018 JDK版本:1.8.0...

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果。本文通过Java程序代码介绍具体实现方法。

    程序环境:

    • 测试文档:Office Excel 2013
    • 编译环境:IntelliJ IDEA 2018
    • JDK版本:1.8.0
    • Excel库:Java系列spire.xls.jar 3.9.1(本次测试使用免费版)

     

    Java全部测试代码

    1.绘制单一水印效果

    import com.spire.xls.*;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
    
    public class TextWatermark {
        public static void main(String[] args) {
            //加载Excel测试文档
            Workbook wb = new Workbook();
            wb.loadFromFile("test.xlsx");
    
            //设置文本和字体大小
            Font font = new Font("仿宋", Font.PLAIN, 40);
    
            for (int i =0;i<wb.getWorksheets().getCount();i++)
            {
                Worksheet sheet = wb.getWorksheets().get(i);
                //调用DrawText() 方法插入图片
                BufferedImage imgWtrmrk = drawText("内部专用", font, Color.pink, Color.white, sheet.getPageSetup().getPageHeight(), sheet.getPageSetup().getPageWidth());
    
                //将图片设置为页眉
                sheet.getPageSetup().setLeftHeaderImage(imgWtrmrk);
                sheet.getPageSetup().setLeftHeader("&G");
    
    
                //将显示模式设置为Layout
                sheet.setViewMode(ViewMode.Layout);
            }
    
            //保存文档
            wb.saveToFile("TextWatermark.xlsx", ExcelVersion.Version2013);
        }
        private static BufferedImage drawText (String text, Font font, Color textColor, Color backColor,double height, double width)
        {
            //定义图片宽度和高度
            BufferedImage img = new BufferedImage((int) width, (int) height, TYPE_INT_ARGB);
    
            Graphics2D loGraphic = img.createGraphics();
    
            //获取文本size
            FontMetrics loFontMetrics = loGraphic.getFontMetrics(font);
            int liStrWidth = loFontMetrics.stringWidth(text);
            int liStrHeight = loFontMetrics.getHeight();
    
            //文本显示样式及位置
            loGraphic.setColor(backColor);
            loGraphic.fillRect(0, 0, (int) width, (int) height);
            loGraphic.translate(((int) width - liStrWidth) / 2, ((int) height - liStrHeight) / 2);
            loGraphic.rotate(Math.toRadians(-45));
    
            loGraphic.translate(-((int) width - liStrWidth) / 2, -((int) height - liStrHeight) / 2);
            loGraphic.setFont(font);
            loGraphic.setColor(textColor);
            loGraphic.drawString(text, ((int) width - liStrWidth) / 2, ((int) height - liStrHeight) / 2);
            loGraphic.dispose();
            return img;
        }
    }
    

    2.绘制多个水印效果

    import com.spire.xls.*;
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    
    import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
    
    public class TextWatermark {
        public static void main(String[] args) {
            //加载Excel测试文档
            Workbook wb = new Workbook();
            wb.loadFromFile("test.xlsx");
    
            //设置文本和字体大小
            Font font = new Font("仿宋", Font.PLAIN, 20);
    
            for (int i =0;i<wb.getWorksheets().getCount();i++)
            {
                Worksheet sheet = wb.getWorksheets().get(i);
                //调用DrawText() 方法插入图片
                BufferedImage imgWtrmrk = drawText("内部专用     内部专用    内部专用    内部专用", font, Color.pink, Color.white, sheet.getPageSetup().getPageHeight(), sheet.getPageSetup().getPageWidth());
    
    
                //将图片设置为页眉
                sheet.getPageSetup().setLeftHeaderImage(imgWtrmrk);
                sheet.getPageSetup().setLeftHeader("&G");
    
                //将显示模式设置为Layout
                sheet.setViewMode(ViewMode.Layout);
            }
    
            //保存文档
            wb.saveToFile("TextWatermark.xlsx", ExcelVersion.Version2013);
        }
        private static BufferedImage drawText (String text, Font font, Color textColor, Color backColor,double height, double width)
        {
            //定义图片宽度和高度
            BufferedImage img = new BufferedImage((int) width, (int) height, TYPE_INT_ARGB);
    
            Graphics2D loGraphic = img.createGraphics();
    
            //获取文本size
            FontMetrics loFontMetrics = loGraphic.getFontMetrics(font);
            int liStrWidth = loFontMetrics.stringWidth(text);
            int liStrHeight = loFontMetrics.getHeight();
    
            //文本显示样式及位置
            loGraphic.setColor(backColor);
            loGraphic.fillRect(0, 0, (int) width, (int) height);
            loGraphic.translate(((int) width - liStrWidth) / 2, ((int) height - liStrHeight) / 2);
            loGraphic.rotate(Math.toRadians(-45));
    
            loGraphic.translate(-((int) width - liStrWidth) / 4, -((int) height - liStrHeight) / 4);
            loGraphic.setFont(font);
            loGraphic.setColor(textColor);
            loGraphic.drawString(text, ((int) width - liStrWidth) /4 , ((int) height - liStrHeight) /2);
            loGraphic.drawString(text,((int) width - liStrWidth) /2, ((int) height - liStrHeight) / 4);
            loGraphic.drawString(text,((int) width - liStrWidth) /6, ((int) height - liStrHeight) /20);
            loGraphic.dispose();
            return img;
        }
    }
    

    水印效果:

     

    需要注意的是:在添加完水印效果后,查看文档时,在“普通视图”水印不可见,需在“页面布局”模式或“打印预览”模式下查看。

     

    展开全文
  • java操作excel实现图片水印

    万次阅读 2017-05-05 11:19:14
    java操作excel实现图片水印是不可能实现的 不过可以先添加背景图,再在背景图上填写代码 模板一:只有背景图 模板二:只有数据 模板三:二者合并

    下载链接:http://download.csdn.net/detail/u012102536/9834232


    jar包

    java操作excel实现图片水印是不可能实现的  不过可以先添加背景图,再在背景图上填写代码


    模板一:只有背景图

    模板二:只有数据

    模板三:二者合并





    代码的一部分:

    package com.ekingstar.zcgl.bean.waterPrint;


    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;


    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    public class copy2 {
        public static void main(String[] args) throws Exception {
           File file = new File("d:\\CW_JFKZXSJ.xls");
           String[][] result = getData(file, 1);
           int rowLength = result.length;
           for(int i=0;i<rowLength;i++) {
               for(int j=0;j<result[i].length;j++) {
                  System.out.print(result[i][j]+"\t\t");
               }
               System.out.println();
           }
           




           
        }
        /**
         * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行
         * @param file 读取数据的源Excel
         * @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1
         * @return 读出的Excel中数据的内容
         * @throws FileNotFoundException
         * @throws IOException
         */
        public static String[][] getData(File file, int ignoreRows)
               throws FileNotFoundException, IOException {
           List<String[]> result = new ArrayList<String[]>();
           int rowSize = 0;
           BufferedInputStream in = new BufferedInputStream(new FileInputStream(
                  file));
           // 打开HSSFWorkbook
           POIFSFileSystem fs = new POIFSFileSystem(in);
           HSSFWorkbook wb = new HSSFWorkbook(fs);
           
           
           String filename0="d://test99.xls";
           
           HSSFWorkbook wb1 = new HSSFWorkbook(new FileInputStream(new File(filename0)));
           
           
           
           
           HSSFCell cell = null;
           for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
               HSSFSheet st = wb.getSheetAt(sheetIndex);
               HSSFSheet st1 = wb1.getSheetAt(sheetIndex);
               // 第一行为标题,不取
               for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
                  HSSFRow row = st.getRow(rowIndex);
                  HSSFRow row1 = st1.getRow(rowIndex);
                  if (row == null) {
                      continue;
                  }
                  int tempRowSize = row.getLastCellNum() + 1;
                  if (tempRowSize > rowSize) {
                      rowSize = tempRowSize;
                  }
                  String[] values = new String[rowSize];
                  Arrays.fill(values, "");
                  boolean hasValue = false;
                  for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
                      String value = "";
                      cell = row.getCell(columnIndex);
                      if (cell != null) {
                         // 注意:一定要设成这个,否则可能会出现乱码
                         cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                         switch (cell.getCellType()) {
                         case HSSFCell.CELL_TYPE_STRING:
                             value = cell.getStringCellValue();
                             break;
                         case HSSFCell.CELL_TYPE_NUMERIC:
                             if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                Date date = cell.getDateCellValue();
                                if (date != null) {
                                    value = new SimpleDateFormat("yyyy-MM-dd")
                                           .format(date);
                                } else {
                                    value = "";
                                }
                             } else {
                                value = new DecimalFormat("0").format(cell
                                       .getNumericCellValue());
                             }
                             break;
                         case HSSFCell.CELL_TYPE_FORMULA:
                             // 导入时如果为公式生成的数据则无值
                             if (!cell.getStringCellValue().equals("")) {
                                value = cell.getStringCellValue();
                             } else {
                                value = cell.getNumericCellValue() + "";
                             }
     。。。。。。


    请下载我的资源    就一个java文件

    展开全文
  • Excel添加水印图片

    2018-08-23 09:14:03
    1.lib文件夹包含POI相关的jar 2.src文件夹包含水印图片生成的类以及Excel添加水印图片的源码
  • java实现导出带有水印excel

    千次阅读 2020-06-16 11:39:54
    java导出带有水印excel起因实现思路代码实现思考 起因 最近接到了一个比较恶心的需求,要求在导出的excel中增加水印,并且要求必须是要excel,因为他们要对excel中的数据做操作(既然要操作那水印同样可以删掉,...
  • java POI为excel添加水印

    千次阅读 热门讨论 2020-05-06 14:38:19
    网络上充斥着各种为excel添加水印的方法,但是多数效果不敢恭维,这里介绍两种添加excel水印的方法,最终实现的效果跟excel工具添加的水印无异,个人比较喜欢比较推荐。 这里说是两种,其实原理是一种,只不过因为...
  • 注:操作必须先生成水印图片并将水印图片添加至excel中,然后再将数据往excel中写入,否则在加入水印的时候会删除原excel文件并重新生成新的文件(原因是:因为懒没有去细看为啥会这样)。使用的包是 spire.xls.free...
  • jxl完美实现Excel水印(内附源码及jar包,基于jxl2.6.12修改编译版)
  • Java实现Excel和word转pdf加水印,复制及可用 时隔大半年,之前朋友,今天突然找我说,他们有个需求要做这东西。想起来之前自己照着官方文档写,也走了不少坑。今天就索性写个,也为了方便以后使用。 jar包网盘...
  • 先看效果: 然后直接上代码 ... * @param waterName 水印名称 * @param type 文件类型 */ public static void excelWaterMarkPOI(String path,String pwd,String waterName,int type){ try { BufferedI
  • java poi excel无法添加水印替代方法

    千次阅读 2020-01-30 14:41:13
    提供一种可行办法就是预留一份现成的带有水印excel模板,以模板创建workbook,再向其添加内容,这样即可实现导出带有水印excel,需要注意的是poi版本不能太老,太老的不支持此操作。 代码试例如下: @Web...
  • java实现Excel中插入图片有时碰到下载excel中加入图片或已经制作好的图章。
  • java利用poi为excel添加图片水印,还没研究文字水印的。。 所需jar包:poi-3.17.jar, poi-ooxml-3.17.jar, ooxml-schemas-1.3.jar,commons-collections4-4.1.jar,xmlbeans-2.6.0.jar, Spire.Office.jar或Spire.Xls....
  • 使用jxl给excel水印

    2018-10-23 10:58:19
    使用jxl给excel水印,jxl.jar下载,里面有代码示例。
  • POI操作Excel生成水印,该水印其实就是一个图片,该代码是将文字生成图片,再将图片变成水印的。
  • JAVA POI导出Excel文件并添加水印

    千次阅读 2021-03-01 10:32:28
    本文将介绍导出的excel文件增加水印和jsp页面增加水印两种 本文参考https://www.cnblogs.com/liuyu666/p/13282864.html;https://gitee.com/guo492273770/POIexcel/blob/master/src/ExcelWaterRemarkUtils.java ...
  • 主要介绍了Windows中使用Java生成Excel文件并插入图片的方法,其中向Excel中插入图片文中通过使用Apache POI来实现,需要的朋友可以参考下
  • Java基于POI来给导出的Excel动态添加水印 起因 客户提了一个要在导出的Excel里添加导出人员账号和姓名水印的功能,水印常见于ppt和pdf中,Excel用到水印的情况大部分用于打印,而客户这里的Excel加上水印后还要求...
  • 1. 引入依赖 com.alibaba easyexcel 2.2.6 org.apache.poi ooxml-schemas 1.4 com.lowagie itext 2.1.7 2. 代码实现 import com.alibaba.excel.util.FileUtils;...
  • java实现excel转pdf 无水印版

    千次阅读 2020-01-15 11:23:38
    这里就不废话了 直接上代码,所需包在我的另一篇博客,word转pdf里,百度网盘永久有效,是不是很开心! import com.aspose.cells.License; import ... ...import java.io.File;...import java.io.File...
  • 针对excel操作添加背景水印的jar,下载后解压取里面的jar包使用,因为资源存在并且收费,所以针对性的压缩下供大家参考使用。
  • 使用Java为pdf、word和excel添加水印

    千次阅读 2020-09-22 09:43:25
    } /** * excel添加水印 * * @param fileData 原始文件字节数组 * @param outputSrc 生成文件路径 * @param waterMarkName 水印内容 */ private static void addExcelWaterMark(byte[] fileData, String outputSrc, ...
  • excel标签水印

    2017-03-30 16:31:16
    通过jacob在页眉添加文字、图片等方法实现标签水印
  • 逻辑思路 1、先将excel转为pdf (TestForExcel2PDF测试类) 2、然后再pdf上加水印(TestWaterPrint、TestwaterMark都为加水印测试类)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,414
精华内容 965
关键字:

java实现excel水印

java 订阅