Java下载excel文件并且添加水印效果
文件下载公共类
package com.sw.api.utils;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;public class ExportUtil {public void export(HttpServletResponse response) throws IOException {//根据文件流创建XSSFWorkbook对象XSSFWorkbook wb = new XSSFWorkbook();//XSSFSheet sheet = wb.getSheetAt(0);XSSFSheet sheet = wb.createSheet("Sheet1");sheet.setDefaultColumnWidth(16);//设置默认列宽sheet.setDefaultRowHeightInPoints(20);//设置默认行高//设置样式;XSSFCellStyle style = wb.createCellStyle();//设置水平对齐的样式为居中对齐;style.setAlignment(HorizontalAlignment.CENTER);//设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(VerticalAlignment.CENTER);XSSFRow rowRowName = sheet.createRow(0);//设置水印WaterMarkUtil.putWaterMarkToExcel(wb);// 将列头设置到sheet的单元格中String[] rowName = new String[] {"id", "年龄", "名称"};for(int n=0;n<rowName.length;n++){XSSFCell cellRowName = rowRowName.createCell(n);cellRowName.setCellValue(rowName[n]);cellRowName.setCellStyle(style);}//造数据,dataList可以是数据库查询出来的业务数据,动态传参过来List<Object[]> dataList = new ArrayList<Object[]>();Object[] objs1 = new Object[rowName.length];objs1[0] = "1";objs1[1] = "12";objs1[2] = "张三";dataList.add(objs1);Object[] objs2 = new Object[rowName.length];objs2[0] = "2";objs2[1] = "22";objs2[2] = "李四";dataList.add(objs2);//将查询出的数据设置到sheet对应的单元格中for(int i = 0;i < dataList.size();i++){Object[] obj = dataList.get(i);XSSFRow row = sheet.createRow(i+1);//row.setHeight((short) (25 * 20));for(int j = 0; j < obj.length; j++){Cell cell = null;cell = row.createCell(j);if(!"".equals(obj[j]) && obj[j] != null){cell.setCellValue(obj[j].toString());cell.setCellStyle(style);}}}//输出Excel文件OutputStream output= response.getOutputStream();response.reset();String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());String fileName = date + ".xlsx";response.setHeader("Content-Disposition","attachment; filename=" +new String(fileName.getBytes("UTF-8"), "iso-8859-1")+".xlsx");response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");wb.write(output);output.close();}}
添加水印公共类
package com.sw.api.utils;import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class WaterMarkUtil {private static BufferedImage createWaterMark(String[] content) {Integer width = 420;//水印宽度Integer height = 380;//水印高度BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象String fontType = "STSongti-SC-Bold";Integer fontStyle = Font.BOLD;Integer fontSize = 35;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 java.awt.Color(0, 0, 0, 50));g2d.setStroke(new BasicStroke(1));g2d.setFont(font);g2d.rotate(Math.toRadians(-30),(double) image.getWidth() / 2, (double) image.getHeight() / 2);//设置旋转角度FontRenderContext context = g2d.getFontRenderContext();//找到水印信息中最长的int contentLindex = 0;int contentLength = content[0].length();for (int i = 0; i < content.length; i++) {if (content[i].length()>contentLength) {contentLindex = i;}}Rectangle2D bounds = font.getStringBounds(content[contentLindex], context);double x = (width - bounds.getWidth()) / 2;double y = (height - bounds.getHeight()) / 2;double ascent = -bounds.getY();double baseY = y + ascent;// 写入水印文字原定高度过小,所以累计写水印,增加高度for (int i = 0; i < content.length; i++) {g2d.drawString(content[i], (int)x, (int)baseY);// 画出字符串baseY = baseY + font.getSize();}// 设置透明度g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1F));g2d.dispose();return image;}public static void putWaterMarkToExcel(XSSFWorkbook workbook) throws IOException {BufferedImage image = createWaterMark(new String[]{"水印名称logo"});ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);XSSFSheet sheet = workbook.getSheetAt(0);PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);sheet.getCTWorksheet().addNewPicture().setId(pr.getId());}}
Java下载excel文件并且添加水印效果相关推荐
- java下载xlsx文件_【小坑】java下载excel文件
excel文件的导入导出是很常见的功能,这次做了个下载的功能,踩了一些坑,记下来避免以后重复踩-- 1.inputstream序列化问题 Could not write JSON document: ...
- Java 下载 Excel文件打不开
public static String downloadFile(HttpServletResponse response, String fileName, String templatePath ...
- java下载Excel文件并设置表头内容与下拉框
干货干货直接上代码 Maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>p ...
- Java下载Excel文件
以下的java使用的框架是Jfinal. 1. 创建流和工作薄. ServletOutputStream out = null;HSSFWorkbook workbook =null;try {wor ...
- java下载excel文件损坏
<!-- 避免font文件的二进制文件格式压缩破坏 --><plugin><groupId>org.apache.maven.plugins</groupId ...
- 阿里开源(EasyExcel):使用Java将数据导出为Excel表格、带样式----》java web下载 Excel文件
目录 一.技术选型 二.实现过程 1.导入依赖 2.编写工具类 EasyExcelUtil 3.公用参数类 EasyExcelParams 4.表格样式实体类 MyWriteHandler 5.数据实 ...
- 超详细的java生成excel文件并下载
在网上随手一搜,可以搜到很多java生成excel文件相关的博客,但每个都有不同,核心点说清楚了,但具体运用的时候,相信大家或多或少都没法一次直接运用,这样每次去找并且运用的时候很费时间,所以这也是我 ...
- react接收后端文件_React获取Java后台文件流并下载Excel文件流程解析
记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...
- java文件流下载excel_React获取Java后台文件流下载Excel文件
记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...
- java使用jxl生成excel表格,jsp使用js下载excel文件xls
java使用jxl生成excel表格,jsp使用js下载excel文件 后端代码 maven jar包 主体代码逻辑 引入的jar包 具体代码段 重点详解 表头和表格内容两种格式 直接将 HttpSe ...
最新文章
- 【每日一学】复杂度分析
- 程序员交流平台_Java虚拟机所管理的内存到底有哪些?Java程序员必看栏目(上)...
- 计算机里面照片无法打卡,为什么电脑照片打不开_电脑照片打不开的解决方法...
- 2!=5 or 0在python中是否正确-Python 中的 or and 运算,看这一篇就够
- 根据RTL图编写Verilog程序
- CF1237F Balanced Domino Placements(组合计数,dp)
- mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
- 【ES6(2015)】Set
- 如何优化myeclipse.
- 获取Button脚本挂载的事件名
- 游戏服务器之生成Dump文件
- JS学习之表格的排序
- [转]Git使用基础篇
- [算法题] 安排会议室——贪心算法的应用
- Learning Instagram 学习Instagram Lynda课程中文字幕
- kindle可以上网但是无法下载_您的Kindle已连接WiFi网络,但无法连接互联网的解决办法...
- IDM认证过程日志埋点说明
- HTC Desire Z刷recovery刷机教程
- 【python】python实现多线程并得到返回值
- office安装双击setup后点击‘立即安装’无反应(闪退)
热门文章
- 计算机专业英语学术论文框架,计算机专业英语研究学术论文.pdf
- 好站推荐-四个在线识别字体网站,从此不在为找字体烦恼
- 有长度,有角度,有点积,有人性
- python普通人能学吗_普通人可以学Python吗
- Linux--Ubuntu的使用
- java mail authen,javaxmail发送邮件:用Authenticator的子类进行身份验证及策略模式(Strategy)...
- 输入罗马数字1到12输出阿拉伯数字C语言,用C语言古罗马数字转化阿拉伯数字
- apesv100数据库_生物信息学相关数据库资源介绍..ppt
- MES制造执行系统的四层架构体系
- 华为freebuds4i降噪方法分享(教程分享)