java后端生成pdf模板合并单元格表格

  • 这里只放部分片段的代码
    java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的
	/**
 	 * 添加子女教育规划表。
 	 * @param name 子女姓名
 	 * @param educationItems 某个孩子的教育规划的二维数组,每列依次是:学程阶段、年数、费用支出(元)/年、年增长率
 	 * @param spacing
 	 * @throws DocumentException
 	 * @throws IOException
 	 */
private void addEducationTable(String name, String[][] educationItems, float spacing) throws DocumentException, IOException
	{
	addParagraphText(name + "的教育支出规划如下:", getMainTextFont(), 0, SPACING_5, LEADING_MULT);//标题字段
	//以下是表头
	float[] colWidth = new float[] { mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f) };
				String[] colName = { "学程阶段", "年数", "规划值(首次)","发生值(首次)", "年增长率" };//表头列的一维数组
				int[] colAlignment = {Element.ALIGN_LEFT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT }; //表头有几列就写几个对齐方式
				float[] colPaddingLeft = { 3f, 3f, 3f, 3f, 3f };
				float[] colPaddingRight = { 3f, 3f, 3f, 3f, 3f };
				Font[] colFont = { getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont() };//字体及颜色的设置
				educationItems=swap(educationItems, 3, 4);//这是排序二维数组,把第4列换到第3行(从0开始计数)
				PdfPTable table = tableTemplate(educationItems, colWidth, colName, colAlignment, colPaddingLeft, colPaddingRight, colFont);//生成表格
				table.setSpacingAfter(mm2px_height(spacing)); 
				this._document.add(table);//生成到PDF去,代码就不贴了
	}



/**
	 * @param items 二维数组表示的表
	 * @param colWidth 各列的宽度(像素)
	 * @param colName 各列的名称
	 * @param colAlignment 各列的水平对齐方式
	 * @param colPaddingLeft 各列的左padding
	 * @param colPaddingRight 各列的右padding
	 * @param colFont 各列的字体
	 * @return
	 * @throws DocumentException
	 * @throws IOException
	 */
	private PdfPTable tableTemplates(String[][] items, float[] colWidth, String[] colName, int[] colAlignment,
			float[] colPaddingLeft, float[] colPaddingRight, Font[] colFont) throws DocumentException, IOException
	{
		PdfPTable intTable = new PdfPTable(colWidth.length); 
		intTable.setTotalWidth(colWidth);
		intTable.setLockedWidth(true);
		
	    intTable.getDefaultCell().setLeading(mm2px_height(LEADING_CELL_TEXT), 1f); //单元格内文字行间距
	    intTable.getDefaultCell().setBorderColor(COLOR_CELL_BORDER); //边框颜色
	    intTable.setHeaderRows(1); //第一行做表头,跨页再现表头
	    
	    //单元格可以跨页
	    intTable.setSplitLate(false);
	    intTable.setSplitRows(true);
	    /*********************************************************************************************/
	    /***********************************以下是表头标题栏*******************************************/
	    float headerHeight = mm2px_height(TABLE_HEADER_HEIGHT);
	    intTable.getDefaultCell().setFixedHeight(headerHeight); //行高
	    intTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); //无边框
	    
	    for(int i = 0; i < colName.length; i++)
	    {
	    	intTable.getDefaultCell().setBackgroundColor(COLOR_TAB_HEADER); //表头背景
			intTable.getDefaultCell().setHorizontalAlignment(colAlignment[i]);
			intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[i]);
			intTable.getDefaultCell().setPaddingRight(colPaddingRight[i]);
			
			intTable.addCell(new Paragraph(colName[i], getTabHeaderTextFont()));
	    }
	    /*********************************************************************************************/
	    /***********************************以下是表格每行*********************************************/
	    float rowHeight = mm2px_height(TABLE_ROW_HEIGHT);
	    intTable.getDefaultCell().setMinimumHeight(rowHeight); //单元格内文字不确定,不能设置成固定行高  
	    intTable.getDefaultCell().setBackgroundColor(COLOR_CELL_BACK_WHITE);

	    for(int i = 0; i < items.length; i++)
	    {
	    	if(i == items.length - 1) //最后一行有合并单元格
	    	{
	    		intTable.getDefaultCell().setColspan(6);//设置具体合并哪一列
	    		intTable.getDefaultCell().setHorizontalAlignment(colAlignment[0]);
				intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[0]);
				intTable.getDefaultCell().setPaddingRight(colPaddingRight[0]);
	    	    intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT  | Rectangle.BOTTOM); 
	    	    intTable.addCell(new Paragraph(items[i][0], colFont[0]));
	    	}else{
	    		for(int j = 0; j < items[i].length; j++)
	    		{
	    			if(j == 0)intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT  | Rectangle.BOTTOM);
	    			else intTable.getDefaultCell().setBorder(Rectangle.RIGHT  | Rectangle.BOTTOM); 
	    			if(j < colAlignment.length){	
					intTable.getDefaultCell().setHorizontalAlignment(colAlignment[j]);
					intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[j]);
					intTable.getDefaultCell().setPaddingRight(colPaddingRight[j]);
					intTable.addCell(new Paragraph(items[i][j], colFont[j]));
	    		}
	    	}
	    	}
	    }
	    /*********************************************************************************************/
	    
	    return intTable;
	}

/*
*二维数组根据指定列排序到指定位置的方法,f2要大于f1
*/
public String[][] swap(String[][] data,int f1,int f2){
		for (int i = 0; i < data.length; i++) {
			String tamp=data[i][f2];
			for (int j = f2; j >f1; j--) {
				data[i][j]=data[i][j-1];
			}
			data[i][f1]=tamp;
		}
		return data;
	}

	/**
	 * @return 获取表头标题栏字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTabHeaderTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_SIMHEI), FONT_SIZE_TAB_HEADER_TEXT, Font.NORMAL, COLOR_TAB_HEADER_TEXT);
	}

	/**
	 * @return 获取单元格文字字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTabCellTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_SIMHEI), FONT_SIZE_TAB_CELL_TEXT, Font.NORMAL, GDM.COLOR_666666);
	}
	
	/**
	 * @return 获取标题字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTitleFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), FONT_SIZE_TITLE, Font.NORMAL, GDM.COLOR_333333);
	}	
	
	/**
	 * @return 获取标题字体(小)。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getTitleFont_Small() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), FONT_SIZE_TITLE - 1f, Font.NORMAL, GDM.COLOR_333333);
	}
	
	/**
	 * @return 获取正文字体。
	 * @throws DocumentException
	 * @throws IOException
	 */
	private static Font getMainTextFont() throws DocumentException, IOException
	{
		return getFont(GDM.getUrlString(GDM.FONT_NORMAL), FONT_SIZE_MAINTEXT, Font.NORMAL, GDM.COLOR_666666);
	}

加一个生成pdf常用的格式工具类

import java.io.IOException;
import java.net.MalformedURLException;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class FinPlan 
{
	protected Document _document; //文档对象
	protected PdfWriter _writer; //pdf文档输出器
	
	public FinPlan(Document document, PdfWriter writer) 
	{
		super();
		this._document = document;
		this._writer = writer;
	}
	/**
	 * 像素到毫米的转换(高度)
	 * @param px 纵向像素
	 * @return
	 */
	public static float px2mm_height(float px)
	{
		return px * GDM.PAGE_HEIGHT / PageSize.A4.getHeight();
	}
	
	/**
	 * 在指定位置写入文字
	 * @param text 需要写入的文字
	 * @param xPoint 距左边位置(毫米)
	 * @param yPoint 距底边位置(毫米)
	 */
	protected void writeOnSpLocation(float xPoint, float yPoint, String text, Font font)
	{
		PdfContentByte pcb = this._writer.getDirectContent();
		
		xPoint = mm2px_width(xPoint);
		yPoint = mm2px_height(yPoint);
		Paragraph prg = new Paragraph(text, font);
		
		ColumnText.showTextAligned(pcb, PdfContentByte.ALIGN_LEFT, prg, xPoint, yPoint, 0);
	}
	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore) throws DocumentException, IOException
	{
		addTitle(title, font, spacingBefore, 0f);
	}
	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @param spacingAfter 标题后的空白(毫米)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore, float spacingAfter) throws DocumentException, IOException
	{
		Paragraph prg = new Paragraph(title, font);
		spacingBefore = mm2px_height(spacingBefore);
		prg.setSpacingBefore(prg.getLeading() * -1 + prg.getFont().getSize() * 0.8f + spacingBefore);
		//prg.setSpacingAfter(spacingAfter);
		this._document.add(prg);
		
		addSpan(spacingAfter);
	}
	
	
	/**
	 * 添加标题。
	 * @param title 标题
	 * @param font 标题字体
	 * @param spacingBefore 标题前的空白(毫米)
	 * @param spacingAfter 标题后的空白(毫米)
	 * @param alignment 标题的对齐方式(居中用Element.ALIGN_CENTER)
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addTitle(String title, Font font, float spacingBefore, float spacingAfter, int alignment) throws DocumentException, IOException
	{
		Paragraph prg = new Paragraph(title, font);
		spacingBefore = mm2px_height(spacingBefore);
		prg.setSpacingBefore(prg.getLeading() * -1 + prg.getFont().getSize() * 0.8f + spacingBefore);
		prg.setAlignment(alignment);
		//prg.setSpacingAfter(spacingAfter); 改用下面的 addSpan(spacingAfter);
		this._document.add(prg);
		
		addSpan(spacingAfter);
	}

	
	/**
	 * 添加段落文本。
	 * @param text 段落文本
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param leadingMult 文本行间距倍数
	 * @throws DocumentException
	 */
	protected void addParagraphText(String text, Font font, float spacingBefore, float leadingMult) throws DocumentException
	{	
		addParagraphText(text, font, spacingBefore, 0f, leadingMult);
	}
	
	/**
	 * 添加段落文本。
	 * @param text 段落文本
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param spacingAfter 段落后的空白(毫米)
	 * @param leadingMult 文本行间距倍数
	 * @throws DocumentException
	 */
	protected void addParagraphText(String text, Font font, float spacingBefore, float spacingAfter, float leadingMult) throws DocumentException
	{
		Paragraph prg = new Paragraph(text, font); //.trim()
		spacingBefore = mm2px_height(spacingBefore);
		//spacingAfter = mm2px_height(spacingAfter);
		prg.setLeading(prg.getLeading() * leadingMult);
		prg.setSpacingBefore(prg.getLeading() * -1f + prg.getFont().getSize() * 0.8f + spacingBefore); 
		//prg.setSpacingAfter(spacingAfter);
		//prg.setFirstLineIndent(prg.getFont().getSize() * 2f); //首行缩进
		prg.setAlignment(Element.ALIGN_LEFT); //对齐方式
		this._document.add(prg);
		
		addSpan(spacingAfter);
	}
	
	/**
	 * 添加跨页后不再起作用的间隔。
	 * @param gap 间隔大小(毫米)
	 * @throws DocumentException
	 */
	protected void addSpan(float gap) throws DocumentException
	{
		PdfPTable spanTable = new PdfPTable(1);
		spanTable.setTotalWidth(this._document.right() - this._document.left());
		spanTable.setLockedWidth(true);
		spanTable.getDefaultCell().setBorder(Rectangle.NO_BORDER);
		spanTable.setSpacingAfter(mm2px_height(gap)); //表后面的间隔,跨页之后不再起作用,要的就是这个效果		
		spanTable.addCell("");
		this._document.add(spanTable);
	}
	
	/**
	 * 添加每一章的头部文字。
	 * @param headerCH 头部中文
	 * @param headerEN 头部英文
	 * @throws DocumentException
	 * @throws IOException
	 */
	protected void addChapterHeader(String headerCH, String headerEN) throws DocumentException, IOException
	{
		Font fontCH = getFont(GDM.getUrlString(GDM.FONT_HEADER_CH), GDM.FONT_SIZE_HEADER_CH, Font.NORMAL, GDM.COLOR_GOLD);
		Font fontEN = getFont(GDM.getUrlString(GDM.FONT_HEADER_EN), GDM.FONT_SIZE_HEADER_EN, Font.NORMAL, GDM.COLOR_GOLD);
		
		Phrase phrase = new Phrase();
		Chunk chunkCH = new Chunk(headerCH, fontCH);
		phrase.add(chunkCH);
		phrase.add(Chunk.NEWLINE);
    	Chunk chunkEN = new Chunk(headerEN, fontEN);
    	phrase.add(chunkEN);
    	
    	Paragraph prg = new Paragraph(phrase);    	
		prg.setSpacingAfter(mm2px_width(GDM.SPACING_AFTER_HEADER));

		this._document.add(prg);
	}
	
	/**
	 * 添加小节的头部图片
	 * @param imgFilename 含路径的图片文件名
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addSectionHeader(String imgFilename) throws MalformedURLException, IOException, DocumentException
	{	
		Paragraph prg = new Paragraph("");
		prg.setLeading(0);
		this._document.add(prg);//在新开页中,上面段落的行间距会影响图片的位置
		
		float width = GDM.PAGE_WIDTH - GDM.MARGIN_LEFT - GDM.MARGIN_RIGHT;
		float height = GDM.HEIGHT_SECTIONHEADER;
		
		addImage(imgFilename, width, height);
	}	
	
	
	/**
	 * 添加图片。
	 * @param imgFilename 含路径的图片文件名
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImage(String imgFilename, float width, float height) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgFilename);
		addImage(img, width, height);
	}
	
	/**
	 * 添加图片。
	 * @param imgByte 图片内存数组
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImage(byte[] imgByte, float width, float height) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgByte);
		addImage(img, width, height);
	}
	
	/**
	 * 添加图片。	 
	 * @param img 图片
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @throws DocumentException
	 */
	private void addImage(Image img, float width, float height) throws DocumentException
	{
		img.setAlignment(Image.ALIGN_LEFT);
		width = mm2px_width(width);
		height = mm2px_height(height);
		img.scaleAbsolute(width, height);
		
		this._document.add(img);
	}
	
	/**
	 * 在指定位置添加图片。
	 * @param imgFilename 含路径的图片文件名
	 * @param width 图片宽度(毫米)
	 * @param height 图片高度(毫米)
	 * @param xPoint 距左边位置(毫米)
	 * @param yPoint 距底边位置(毫米)
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addImageOnSpLocation(String imgFilename, float width, float height, float xPoint, float yPoint) throws MalformedURLException, IOException, DocumentException
	{
		Image img = Image.getInstance(imgFilename);
		img.setAlignment(Image.ALIGN_LEFT);
		
		width = mm2px_width(width);
		height = mm2px_height(height);
		img.scaleAbsolute(width, height);
		
		xPoint = mm2px_width(xPoint);
		yPoint = mm2px_height(yPoint);
		img.setAbsolutePosition(xPoint, yPoint);
		
		this._document.add(img);
	}
	
	/**
	 * 画线。
	 * @param beginX 开始X坐标(毫米)
	 * @param beginY 开始Y坐标(毫米)
	 * @param endX 终止X坐标(毫米)
	 * @param endY 终止Y坐标(毫米)
	 * @param lineWidth
	 * @param color
	 */
	protected void drawLint(float beginX, float beginY, float endX, float endY, float lineWidth, BaseColor color)
	{
		PdfContentByte cb = _writer.getDirectContent();
		cb.setLineWidth(lineWidth);
		cb.setColorStroke(color);
		
		beginX = mm2px_width(beginX);
		beginY = mm2px_height(beginY);
		endX = mm2px_width(endX);
		endY = mm2px_height(endY);
		
		cb.moveTo(beginX, beginY);
		cb.lineTo(endX, endY);
		
		cb.stroke();
	}
	
	/**
	 * 添加新的页面
	 */
	protected void newPage()
	{
		this._document.newPage();
		//this._writer.setPageEmpty(false); //fasle-页内容为空依然显示; true-页内容为空不会显示
	}
	
	/**
	 * 获取字体。
	 * @param fontname 字体名称(含路径)
	 * @param fontsize 字体大小
	 * @param fontstyle 字体风格
	 * @param color 字体颜色
	 * @return 字体
	 * @throws DocumentException
	 * @throws IOException
	 */	
	public static Font getFont(String fontname, float fontsize, int fontstyle, BaseColor color) throws DocumentException, IOException
	{
		BaseFont bfont = BaseFont.createFont(fontname, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		return new Font(bfont, fontsize, fontstyle, color);
	}
	
	/**
	 * 像素到毫米的转换(宽度)
	 * @param px 横向像素
	 * @return
	 */
	public static float px2mm_width(float px)
	{
		return px * GDM.PAGE_WIDTH / PageSize.A4.getWidth();
	}
	
	/**
	 * 毫米到像素的转换(宽度)
	 * @param mm 横向毫米
	 * @return
	 */
	public static float mm2px_width(float mm)
	{
		return mm * PageSize.A4.getWidth() / GDM.PAGE_WIDTH; //A4纸宽210毫米
	}

	/**
	 * 毫米到像素的转换(高度)
	 * @param mm 纵向毫米
	 * @return
	 */
	public static float mm2px_height(float mm)
	{
		return mm * PageSize.A4.getHeight() / GDM.PAGE_HEIGHT; //A4纸高297毫米
	}
	
	/**
	 * 添加法律声明、我们的观点、假设和依据、资产配置策略。
	 * @version 2017-03-30
	 * @param segments 文字或图片
	 * @param font 字体
	 * @param spacingBefore 段落前的空白(毫米)
	 * @param leadingMult 行间距
	 * @throws MalformedURLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	protected void addPdfWord(Object[] segments, Font font, float spacingBefore, float leadingMult) throws MalformedURLException, IOException, DocumentException
	{
		for(Object obj : segments)
		{
			if(obj instanceof byte[])
			{
				Image img = Image.getInstance((byte[])obj);
				addImageTab(img);
			}
			else if(obj instanceof String)
			{
				addParagraphText((String)obj, font, spacingBefore, px2mm_height(font.getSize()) * leadingMult, leadingMult);
			}	
		}
	}

	
		/**
	 * 以表格的方式添加图片。
	 * @version 2017-04-19
	 * @param img 图片
	 * @throws DocumentException
	 */
	protected void addImageTab(Image img) throws DocumentException
	{		
		float imgWidth = img.getWidth();
		float imgHeight = img.getHeight();
		float docWidth = this._document.right() - this._document.left();
		float docHeight = this._document.top() - this._document.bottom() - 5f * 2;
		
		float scalePercent_w = 100f;
		if(imgWidth > docWidth) scalePercent_w = docWidth * 100f / imgWidth;
		float scalePercent_h = 100f;
		if(imgHeight > docHeight) scalePercent_h = docHeight * 100f / imgHeight;
		
		float scalePercent = Math.min(scalePercent_w, scalePercent_h);
		float fixedHeight = imgHeight * scalePercent / 100f;
		
		img.setAlignment(Image.ALIGN_LEFT);
		img.scalePercent(scalePercent);
		
		PdfPTable table = new PdfPTable(1); 
    	table.setWidthPercentage(100f);
    	
		PdfPCell imgCell = new PdfPCell(img);
		imgCell.setPadding(0f);
		imgCell.setFixedHeight(fixedHeight);
		imgCell.setBorder(Rectangle.NO_BORDER);
		table.addCell(imgCell);
		table.setHorizontalAlignment(Element.ALIGN_CENTER);
		table.setSpacingAfter(5f);
		table.setSpacingBefore(5f);
		table.keepRowsTogether(0);
		
		this._document.add(table);
	}
	
	/**
	 * 根据所在区域的宽高对图片进行不变形缩放。
	 * @param imgByte 图片
	 * @param scaleWidth 所在区域宽度
	 * @param scaleHeight 所在区域高度
	 * @return
	 * @throws BadElementException
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	protected Image scaledImage(byte[] imgByte, float scaleWidth, float scaleHeight) throws BadElementException, MalformedURLException, IOException
	{
		Image img = Image.getInstance(imgByte);		
		float imgWidth = img.getWidth();
		float imgHeight = img.getHeight();	
		float scalePercent_w = 100f;
		if(imgWidth > scaleWidth) scalePercent_w = scaleWidth * 100f / imgWidth;
		float scalePercent_h = 100f;
		if(imgHeight > scaleHeight) scalePercent_h = scaleHeight * 100f / imgHeight;
		
		float scalePercent = Math.min(scalePercent_w, scalePercent_h);
		img.setAlignment(Image.ALIGN_LEFT);
		img.scalePercent(scalePercent);	
		
		return img;
	}
	

	/**
	 * 获取文档可操作区域的宽度(像素)。
	 * @return
	 */
	protected float getDocWidth()
	{
		return this._document.right() - this._document.left();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_41927845/article/details/86981060
今日推荐