导出world
use Maven & Spring Boot
quartz_boot_vue/ dataCk
<!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext-rtf</artifactId>
<version>2.1.7</version>
</dependency>
code
import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.util.DocStyleUtils;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfFont;
/**
* 导出word 表格
* @param response
* @param req
* @throws DocumentException
* @throws IOException
*/
@RequestMapping(value = "export")
public void export(HttpServletResponse response, HttpServletRequest req)
throws DocumentException, IOException {
// 以A4纸大小输出word
Document doc = new Document(PageSize.A4);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把word与输出流绑定
RtfWriter2.getInstance(doc, baos);
// 开始写入word,必须调用这个方法才能进行word的写入
doc.open();
// 加载额外字体的第一种方法:iText本身支持的字体少,这个时候可以使用系统自带的字体
/* FontFactory.register("C:\\WINDOWS\\Fonts\\simsun.ttc");
*//* // 这是另一种加载字体的方法,把字体文件放到webapp下,防止某些电脑并没有第一种方法中的字体.
String realPath = req.getSession().getServletContext().getRealPath("/") + "font/";
FontFactory.register(realPath + "FZSTK.TTF"); // 方正舒体
FontFactory.register(realPath + "simfang.ttf"); // simfang
FontFactory.register(realPath + "simhei.ttf"); // 黑体
FontFactory.register(realPath + "simkai.ttf");*//*
// 对字体文件右键查看详细信息的标题,可以获取getFont方法中第一个参数的字符串.
// 第二个参数不用管是编码集, 第三个参数是字体大小
Font titlefont = FontFactory.getFont("simsun", BaseFont.WINANSI, 14);*/
BaseFont bfChinese = BaseFont.createFont();
// BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 标题字体风格
Font titlefont = new Font(bfChinese, 12, Font.BOLD);
// 设置字体大小
titlefont.setSize(14);
// 设置字体格式,只能设置一种格式
titlefont.setStyle(Font.BOLD);
// 设置字体的重载方法,可以传递多种样式,比如加粗倾斜
titlefont.setStyle("bold, italic");
// 加入一个段落,第一个参数是段落内容,第二个是字体
Paragraph paragraph = new Paragraph("第一个段落", titlefont);
// 设置段落的首行缩进
paragraph.setFirstLineIndent(50);
// 设置段落的段前间距,单位是float,这里与word本身不同不是磅值是厘米
paragraph.setSpacingBefore(5);
// 设置段落的段后间距,单位是float,这里与word本身不同不是磅值是厘米
paragraph.setSpacingAfter(5);
// 设置段落的右侧间距
paragraph.setIndentationRight(30);
// 设置段落的左侧间距
paragraph.setIndentationLeft(30);
// 将段落添加到word
doc.add(paragraph);
// 申明一个6行的表格
Table table = new Table(6);
// 设置表格宽度
table.setBorderWidth(1);
// 设置表格每行的单元格的宽度,数组的长度表明了每行的单元格数量
int[] widths = {10, 13, 13, 15, 15, 15};
// 设置每行的单元格
table.setWidths(widths);
// 设置表格所占的%
table.setWidth(91);
// 设置表格的对齐方式
table.setAlignment(Element.ALIGN_MIDDLE);
table.setAlignment(Element.ALIGN_CENTER);
for (int j = 0; j < 6; j++) {
for (int i = 0; i < 6; i++) {
// 申明一个单元格,Phrase表示单元格内容,参数1是单元格的文本内容,参数2是字体
Cell cell = new Cell(new Phrase("content" + i, titlefont));
// 水平对齐方式
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
// 垂直对齐方式
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
// 将单元格插入到表格
table.addCell(cell);
}
}
// 将表格添加到word
doc.add(table);
//添加图片
/* Image img = null;
String imgUrl = "d://dog.png";
if(!StringUtils.isEmpty(imgUrl)){
try {
// 这个方法用于获取图片,可以传递图片的路径,或者可以传递图片的byte[]内容
img = Image.getInstance(imgUrl);
// 设置图片大小
img.scaleAbsolute(180, 180);
} catch (Exception e) {
e.printStackTrace();
}
}
doc.add(img);*/
// 关闭word文档对象,调用这个方法之后就无法添加内容到这个doc对象了.
doc.close();
String fileName = "测试.doc";
response.setContentType("application/msword;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment; filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
// 得到输入流
try (OutputStream os = response.getOutputStream()) {
//这个是spring的工具类 ,是下面注释代码的实现
StreamUtils.copy(baos.toByteArray(), os);
/*
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
baos.close();
os = response.getOutputStream();
byte[] b = new byte[10240];
int length;
while ((length = bais.read(b))> 0)
os.write(b, 0, length);
os.flush();
os.close();
bais.close();*/
} catch (Exception e) {
}
}
复杂导出World
@RequestMapping(value = "exss")
public void createDocContext( HttpServletResponse response, HttpServletRequest req, String contextString)
throws DocumentException, IOException {
// 设置纸张大小
Document document = new Document(PageSize.A4);
// 建立一个书写器,与document对象关联
ByteArrayOutputStream baos = new ByteArrayOutputStream();
RtfWriter2.getInstance(document,baos);
document.open();
document.setMargins(90f, 90f, 72f, 72f);
// 设置标题字体样式:方正小标宋_GBK、二号、粗体
// Font tFont= DocStyleUtils.setFontStyle("方正小标宋_GBK", 22, Font.BOLD);
RtfFont tFont = new RtfFont("方正小标宋_GBK", 22, Font.BOLD, Color.BLACK);
// 设置正文字体样式:仿宋_GB2312、三号、常规
// Font cFont = DocStyleUtils.setFontStyle("仿 宋_GB2312", 16f, Font.NORMAL);
// 设置中文字体
BaseFont bfChinese = BaseFont.createFont();
// BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 标题字体风格
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
// 正文字体风格
Font contextFont = new Font(bfChinese, 10, Font.NORMAL);
// -----------
// 构建标题
Font cFont = DocStyleUtils.setFontStyle("仿 宋", 16f, Font.NORMAL);
Paragraph title =
DocStyleUtils.setParagraphStyle(
"配电线路故障周报第十二期(03月27日00时—04月03日00时)", tFont, 12f, Paragraph.ALIGN_CENTER);
// 构建[接收单位]
Paragraph jsdw =
DocStyleUtils.setParagraphStyle(
"【接收单位】", /*DocStyleUtils.setFontStyle("黑 体", 18f, Font.BOLD)*/
new RtfFont("黑 体", 18f, Font.NORMAL, Color.BLACK),
32f,
1.2f);
// [接收单位内容]
StringBuffer sb = new StringBuffer();
sb.append("公司各单位,hwhwhwhwh院");
Paragraph jsdwnr = DocStyleUtils.setParagraphStyle(sb.toString(), cFont, 32f, 1.2f);
// 构建【通报内容】
Paragraph tbnr =
DocStyleUtils.setParagraphStyle(
"【通报内容】", /* DocStyleUtils.setFontStyle("黑 体", 18f, Font.BOLD)*/
new RtfFont("黑 体", 18f, Font.NORMAL, Color.black),
32f,
1.2f);
tbnr.setLeading(30f);
// 一、总体情况
Paragraph ztqk =
DocStyleUtils.setParagraphStyle(
" 一、总体情况", DocStyleUtils.setFontStyle("方正黑体_GBK", 16f, Font.BOLD), 32f, 1.2f);
StringBuffer finalResult = new StringBuffer();
finalResult.append(
"除了手机上的鸿蒙系统外,华为还将带来搭载鸿蒙系统的MatePadPro2,根据曝光它将会配备12.9英寸120Hz的OLED显示屏,渲染图显示它相较于前代屏幕边框更窄,有着很高的屏占比,5G版本搭载麒麟9000芯片,WiFi版则搭载麒麟9000E,支持40W有线快充和27W无线充电。另外,据说还有个12.2英寸的版本,屏幕会有所不同。\n"
+ "\n"
+ "由于受到美国的制裁,华为在手机等硬件市场遭遇了重创,而鸿蒙系统则是它们开辟的一条面向未来的全新赛道,目前尚处于起步阶段,除了要不断完善系统,覆盖更多类型的终端设备外,还需要配套的软件体系,形成相对完整的生态,并且仅靠自身的设备肯定是不够的,还得邀请更多合作伙伴融入鸿蒙系统的体系,一同绘制万物互联的蓝图。。");
Paragraph p1Content = DocStyleUtils.setParagraphStyle(finalResult.toString(), cFont, 32f, 1.2f);
// --------------------------------------
// Paragraph title = new Paragraph("标题");
// 设置标题格式对齐方式
title.setAlignment(Element.ALIGN_CENTER);
title.setFont(titleFont);
Paragraph context = new Paragraph(contextString);
context.setAlignment(Element.ALIGN_LEFT);
context.setFont(contextFont);
// 段间距
context.setSpacingBefore(3);
// 设置第一行空的列数
context.setFirstLineIndent(20);
// 设置Table表格,创建一个三列的表格
Table table = new Table(3);
int width[] = {25, 25, 50}; // 设置每列宽度比例
table.setWidths(width);
table.setWidth(90); // 占页面宽度比例
table.setAlignment(Element.ALIGN_CENTER); // 居中
table.setAlignment(Element.ALIGN_MIDDLE); // 垂直居中
table.setAutoFillEmptyCells(true); // 自动填满
table.setBorderWidth(1); // 边框宽度
// 设置表头
Cell haderCell = new Cell("表格表头");
haderCell.setHeader(true);
haderCell.setColspan(3);
table.addCell(haderCell);
table.endHeaders();
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL, Color.GREEN);
Cell cell1 = new Cell(new Paragraph("这是一个3*3测试表格数据", fontChinese));
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell1);
table.addCell(new Cell("#1"));
table.addCell(new Cell("#2"));
table.addCell(new Cell("#3"));
try {
document.add(title);
document.add(context);
document.add(jsdw);
document.add(jsdwnr);
document.add(tbnr);
document.add(ztqk);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 字体文档样式
// [接收单位内容]
Font ccFont = DocStyleUtils.setFontStyle("仿 宋", 22f, Font.NORMAL);
StringBuffer sbs = new StringBuffer();
sbs.append("华为在2019年8月份的开发者大会上正式推出了操作系统鸿蒙OS,它是一款面向全场景的分布式操作系统,创造一个超级虚拟终端互联的世界,将人、设备、场景有机地联系在一起,将消费者在全场景生活中接触的多种智能终端实现极速发现、极速连接、硬件互助、资源共享,用最合适的设备提供最佳的场景体验。2020年9月时升级到了鸿蒙OS2.0版本。···\n" + "很多字打出来就被和谐。。。\n" + "内容 和4L 差不多的意思。");
Paragraph wordFile = DocStyleUtils.setParagraphStyle(sbs.toString(), ccFont, 32f, 1.2f);
StringBuffer sbs1 = new StringBuffer();
sbs1.append(" 目前已经有华为自家的电视、车机以及其它品牌的家电设备等搭载了鸿蒙系统,而本次发布会华为将让鸿蒙系统覆盖更多品类的终端设备,首先就是适配手机设备的鸿蒙系统,预计首批升级鸿蒙系统的产品将会有Mate40、Mate40Pro、Mate40Pro+、Mate40RS、MateX2、nova8、nova8Pro、MatePadPro,未来应该会开放更多设备进行升级。华为消费者业务CEO余承东在去年的年度旗舰新品发布盛典上表示,华为在网手机超过7亿台,因此作为全场景智慧生态的入口,手机是华为鸿蒙系统布局非常重要的一部分,华为肯定会尽力让更多产品升级鸿蒙系统。");
Paragraph fs = DocStyleUtils.setParagraphStyle(sbs1.toString(), ccFont, 32f, 1.2f);
document.add(wordFile);
document.add(fs);
// 表格----------------------------
BaseFont bcFont =
BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
Font tableNameFont = new Font(bcFont, 16, Font.BOLD);
Font cellHeadFont = new Font(bcFont, 12, Font.BOLD);
Paragraph tablename1 =
DocStyleUtils.setParagraphStyle("各单位线路故障情况统计", tableNameFont, 0.1f, Paragraph.ALIGN_CENTER);
tablename1.setLeading(0, 0);
tablename1.setSpacingAfter(0);
Font cellFont = new Font(bcFont, 12, Font.NORMAL);
try {
// 创建一 表格(必须指定列,也可指定列和行)
Table table1 = new Table(7);
table1.setAlignment(Element.ALIGN_CENTER);
table1.setWidth(100f);
// table1.setBorderWidthTop(0);
table1.setCellsFitPage(true);
table1.setBorderWidthTop(0);
table1.setTop(0);
table1.setOffset(0);
// 设置每列所占比例
int[] withs = {3, 3, 3, 3, 3, 4, 3};
try {
table1.setWidths(withs);
} catch (DocumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 表头
Cell[] cellHeaders = new Cell[7];
// RtfFont cellFont = new RtfFont("仿宋_GB2312",9,Font.NORMAL,Color.BLACK);
cellHeaders[0] = new Cell(new Phrase("序号", cellHeadFont));
cellHeaders[1] = new Cell(new Phrase("单位", cellHeadFont));
cellHeaders[2] = new Cell(new Phrase("重合不良", cellHeadFont));
cellHeaders[3] = new Cell(new Phrase("重合良好", cellHeadFont));
cellHeaders[4] = new Cell(new Phrase("接地故障", cellHeadFont));
cellHeaders[5] = new Cell(new Phrase("分支线停电", cellHeadFont));
cellHeaders[6] = new Cell(new Phrase("合计", cellHeadFont));
for (int i = 0; i <= 6; i++) {
// 居中显示
cellHeaders[i].setHorizontalAlignment(Element.ALIGN_CENTER);
// 纵向居中显示
cellHeaders[i].setVerticalAlignment(Element.ALIGN_MIDDLE);
table1.addCell(cellHeaders[i]);
}
// 第二行合并跨越
Cell cell001 = new Cell(new Phrase("tjdwmc提交单位名称", cellFont));
cell001.setColspan(2);
cell001.setHorizontalAlignment(Element.ALIGN_CENTER);
cell001.setVerticalAlignment(Element.ALIGN_MIDDLE);
table1.addCell(cell001);
Cell[] cellFirstRow = new Cell[5];
cellFirstRow[0] = new Cell(new Phrase(String.valueOf("chblSum"), cellFont));
cellFirstRow[1] = new Cell(new Phrase(String.valueOf("chlhSum"), cellFont));
cellFirstRow[2] = new Cell(new Phrase(String.valueOf("jdgzSum"), cellFont));
cellFirstRow[3] = new Cell(new Phrase(String.valueOf("fzxtdSum"), cellFont));
cellFirstRow[4] =
new Cell(new Phrase(String.valueOf("chblSum+chlhSum+jdgzSum+fzxtdSum"), cellFont));
for (int i = 0; i < cellFirstRow.length; i++) {
// 居中显示
cellFirstRow[i].setHorizontalAlignment(Element.ALIGN_CENTER);
// 纵向居中显示
cellFirstRow[i].setVerticalAlignment(Element.ALIGN_MIDDLE);
table1.addCell(cellFirstRow[i]);
}
int i = 0;
for (int j = 0; j < 5; j++) {
i = i + 1;
Cell[] cell = new Cell[7];
cell[0] = new Cell(new Phrase(String.valueOf(i), cellFont));
cell[1] = new Cell(new Phrase(String.valueOf("map.get()"), cellFont));
cell[2] = new Cell(new Phrase(String.valueOf("map.get( 重合不良 )"), cellFont));
cell[3] = new Cell(new Phrase(String.valueOf("所发生的"), cellFont));
cell[4] = new Cell(new Phrase(String.valueOf("接地故障"), cellFont));
cell[5] = new Cell(new Phrase(String.valueOf("分支线停电"), cellFont));
cell[6] =
new Cell(
new Phrase(
String.valueOf(
Integer.valueOf(30)
+ Integer.valueOf(10)
+ Integer.valueOf(11)
+ Integer.valueOf(11)),
cellFont));
for (int k = 0; k < cell.length; k++) {
// 居中显示
cell[k].setHorizontalAlignment(Element.ALIGN_CENTER);
// 纵向居中显示
cell[k].setVerticalAlignment(Element.ALIGN_MIDDLE);
table1.addCell(cell[k]);
}
}
document.add(tablename1);
document.add(table1);
document.add(table);
document.add(p1Content);
document.close();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 导出Zip
String fileName = "sdfsdf测试Word.doc";
response.setContentType("application/msword;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment; filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
// 得到输入流
try (OutputStream os = response.getOutputStream()) {
//这个是spring的工具类 ,是下面注释代码的实现
StreamUtils.copy(baos.toByteArray(), os);
/*
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
baos.close();
os = response.getOutputStream();
byte[] b = new byte[10240];
int length;
while ((length = bais.read(b))> 0)
os.write(b, 0, length);
os.flush();
os.close();
bais.close();*/
} catch (Exception e) {
}
}
StyleUtils
package com.example.demo.util;
import com.lowagie.text.Chunk;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import java.awt.Color;
public class DocStyleUtils {
/**
* 功能说明:设置字体的样式,颜色为黑色</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param family 字体类型
* @param size 字体大小,22f为二号,18f为小二号,16f为三号
* @param style 字体样式
* @return
*/
public static Font setFontStyle(String family, float size, int style) {
return setFontStyle(family, Color.BLACK, size, style);
}
/**
* 功能说明:设置字体的样式</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param family 字体类型
* @param color 字体颜色
* @param size 字体大小,22f为二号,18f为小二号,16f为三号
* @param style 字体样式
* @return
*/
public static Font setFontStyle(String family, Color color, float size, int style) {
Font font = new Font();
font.setFamily(family);
font.setColor(color);
font.setSize(size);
font.setStyle(style);
return font;
}
/**
* 功能说明:为文字填充浅灰色背景</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param content 需要填充背景颜色的内容
* @param appendStr 不需要填充背景颜色的内容
* @return
*/
private static Phrase setPhraseStyle(String content, String appendStr) {
Chunk chunk = new Chunk(content);
// 填充的背景颜色为浅灰色
chunk.setBackground(Color.LIGHT_GRAY);
Phrase phrase = new Phrase(chunk);
phrase.add(appendStr);
return phrase;
}
/**
* 功能说明:设置段落的样式,设置前半截内容和后半截内容格式不一样的段落样式</BR>
* 修改日:2021-04-27
*
* @author hzqq
* @param content 前半截内容
* @param font 字体的样式
* @param firstLineIndent 首行缩进多少字符,16f约等于一个字符
* @param appendStr 后半截内容
* @return
*/
public static Paragraph setParagraphStyle(String content, Font font, float firstLineIndent, String appendStr) {
Paragraph par = setParagraphStyle(content, font, 0f, 12f);
Phrase phrase = new Phrase();
phrase.add(par);
phrase.add(appendStr);
Paragraph paragraph = new Paragraph(phrase);
paragraph.setFirstLineIndent(firstLineIndent);
// 设置对齐方式为两端对齐
paragraph.setAlignment(Paragraph.ALIGN_JUSTIFIED_ALL);
return paragraph;
}
/**
* 功能说明:设置段落的样式,设置前半截内容填充了浅灰色的背景颜色,后半截内容没有背景颜色的段落样式</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param content 前半截有背景颜色的内容
* @param font 字体的样式
* @param firstLineIndent 首行缩进的字符,16f约等于一个字符
* @param leading 行间距12f表示单倍行距
* @param appendStr 后半截内容
* @return
*/
public static Paragraph setParagraphStyle(String content, Font font, float firstLineIndent, float leading,
String appendStr) {
Phrase phrase = setPhraseStyle(content, appendStr);
Paragraph par = new Paragraph(phrase);
par.setFont(font);
par.setFirstLineIndent(firstLineIndent);
par.setLeading(leading);
// 设置对齐方式为两端对齐
par.setAlignment(Paragraph.ALIGN_JUSTIFIED_ALL);
return par;
}
/**
* 功能说明:设置段落的样式,一般用于设置标题</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param content 段落的内容
* @param font 字体样式
* @param leading 行间距
* @param alignment 对齐方式
* @return
*/
public static Paragraph setParagraphStyle(String content, Font font, float leading, int alignment) {
return setParagraphStyle(content, font, 0f, leading, 0f, alignment);
}
/**
* 功能说明:设置段落的样式,对齐方式为两端对齐,缩进样式是文本之后0.2毫米</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param content 段落的内容
* @param font 字体的样式
* @param firstLineIndent 首行缩进多少字符,16f约等于一个字符
* @param leading 行间距
* @return
*/
public static Paragraph setParagraphStyle(String content, Font font, float firstLineIndent, float leading) {
return setParagraphStyle(content, font, firstLineIndent, leading, 0.6f, Paragraph.ALIGN_JUSTIFIED_ALL);
}
/**
* 功能说明:设置段落的样式</BR>
* 修改日期:2021-04-27
*
* @author hzqq
* @param content 段落的内容
* @param font 字体的样式
* @param firstLineIndent 首行缩进多少字符,16f约等于一个字符
* @param leading 行间距
* @param indentationRight 缩进样式中的文本之后多少毫米,0.6f相当于0.2毫米
* @param alignment 对齐方式
* @return
*/
public static Paragraph setParagraphStyle(String content, Font font, float firstLineIndent, float leading,
float indentationRight, int alignment) {
Paragraph par = new Paragraph(content, font);
par.setFirstLineIndent(firstLineIndent);
par.setLeading(leading);
par.setIndentationRight(indentationRight);
par.setAlignment(alignment);
return par;
}
}