精华内容
下载资源
问答
  • 好吧,对于div+css我是完全的菜鸟,哪位大神帮忙写一下呀。谢谢
  • <Button android:text="4" android:id="@+id/b_4"/> android:id="@+id/b_5"/> android:id="@+id/b_6"/> android:id="@+id/b_7"/> android:id="@+id/b_8"/> android:id="@+id/b_9" ...
  • 动态进行创建列表,点击按钮时,动态创建一个两表格
    <!DOCTYPE html>
    
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>js练习五</title>
    <script type="text/javascript">
            var dict = {
            '百度':'http://www.baidu.com',
            '新浪':'http://www.sina.com.cn',
            '谷歌':'http://www.g.cn'
        };
        window.onload = function () {
            document.getElementById('btn').onclick = function () {
                //动态创建表格
                var tableWebsiteList = document.createElement('table');
                tableWebsiteList.border = "1";
                //1.1遍历数据动态建行
                for (var key in dict) {
                    var trObject = document.createElement('tr');
                    var td1 = document.createElement('td');
                    td1.innerHTML = key;
                    var td2 = document.createElement('td');
                    td2.innerHTML = '<a href="' + dict[key] + '">' + key + '</a>';
                    trObject.appendChild(td1);
                    trObject.appendChild(td2);
                    tableWebsiteList.appendChild(trObject);
                }
                //把表格加到body中
                document.body.appendChild(tableWebsiteList);
            };
        };
        </script>
    </head>
    <body>
    <input type="button" name="button" value="OK" id="btn">
    </body>
    </html>
    展开全文
  • HTML网页设计:七、表格

    千次阅读 2021-03-24 21:44:24
    表格 1.表格的定义         HTML中表格由<...每个表格均有若干(由 <...数据单元格可以包含文本、图片、列表、段落、表单、水平线、表格等等。 其定

    表格

    HTML系列文章目录

    1. HTML网页设计:一、HTML的基本结构
    2. HTML网页设计:二、网页的基本标签
    3. HTML网页设计:三、图像标签之<img>标签
    4. HTML网页设计:四、超链接
    5. HTML网页设计:五、行内元素和块元素
    6. HTML网页设计:六、列表
    7. HTML网页设计:七、表格
    8. HTML网页设计:八、媒体元素
    9. HTML网页设计:九、网页的简单布局
    10. HTML网页设计:十、iframe内联框架
    11. HTML网页设计:十一、表单

    1.表格的定义

            HTML中表格由<table>标签来定义。每个表格均有若干行(由 <tr>标签定义),每行被分割为若干单元格(由<td>标签定义),表格标题由<caption>标签指定,表头由<th>标签指定。字母 td 指表格数据(table data),即数据单元格的内容。数据单元格可以包含文本、图片、列表、段落、表单、水平线、表格等等。

    其定义格式如下:

    	<table>
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    

    网页显示如下:
    在这里插入图片描述

    1.表格的常用属性

    (1)border属性:表格和边框属性,如果不定义边框属性,表格将不显示边框。

    代码示例如下:

    	<table border="1px">
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    

    网页显示如下:
    在这里插入图片描述
    (2)cellspacing属性:规定单元格之间的空间。

    一个具有标题和表头,取消单元格之间间距的表格代码示例如下:

    	<table border="1px" cellspacing="0">
    		<caption>一个表格</caption>
    		<tr>
    			<th>第一列</th>
    			<th>第二列</th>
    		</tr>
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    

    网页显示如下:
    在这里插入图片描述

    (3)cellpadding属性:规定单元边沿与其内容之间的空白。

    代码示例如下:

    	<table border="1px" cellspacing="0" cellpadding="10">
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    

    网页显示如下:
    在这里插入图片描述

    (4)bgcolor属性:向表格或表格单元添加背景颜色。
    (5)background属性:向表格或表格单元添加背景图像。
    (6)align属性:规定表格或单元格中内容的水平对齐方式。属性值可以取left左对齐、right右对齐、center居中对齐这三种。

    align属性练习代码示例:

    	<table border="1px" cellspacing="0" width="500px" align="center">
    		<tr>
    			<td align="right">第一行第一列</td>
    			<td align="right">第一行第二列</td>
    		</tr>
    		<tr align="center">
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr align="left">
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    

    网页显示如下:
    在这里插入图片描述

    3.跨行、跨列单元格

    表格中的跨列单元格使用colspan属性,跨行单元格使用rowspan属性。

    代码示例如下:

    	<table border="1" cellspacing="0" width="400px">
    		<caption>课程表</caption>
    		<tr>
    			<th rowspan="2">时间\星期</th>
    			<th colspan="5">星期</th>
    		</tr>
    		<tr>
    			<th>星期一</th>
    			<th>星期二</th>
    			<th>星期三</th>
    			<th>星期四</th>
    			<th>星期五</th>
    		</tr>
    		<tr>
    			<th rowspan="2">上午</th>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    		</tr>
    		<tr>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    		</tr>
    		<tr>
    			<th rowspan="2">下午</th>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    		</tr>
    		<tr>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    		</tr>
    		
    	</table>
    

    网页显示如图:
    在这里插入图片描述
    所有代码如下:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>表格学习</title>
    </head>
    <body>
    <!--	不带边框的表格-->
    	<table>
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    	<br/>
    <!--	带边框的表格-->
    	<table border="1px">
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    	<br/>
    <!--取消单元格间距	带边框的表格 带标题和表头-->
    	<table border="1px" cellspacing="0" >
    		<caption>一个表格</caption>
    		<tr>
    			<th>第一列</th>
    			<th>第二列</th>
    		</tr>
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>
    	<br/>
    <!--	规定单元边沿与其内容之间的间距为10-->
    	<table border="1px" cellspacing="0" cellpadding="10">
    		<tr>
    			<td>第一行第一列</td>
    			<td>第一行第二列</td>
    		</tr>
    		<tr>
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr>
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>	
    	<br/>
    <!--	align属性练习-->
    	<table border="1px" cellspacing="0" width="500px" align="center">
    		<tr>
    			<td align="right">第一行第一列</td>
    			<td align="right">第一行第二列</td>
    		</tr>
    		<tr align="center">
    			<td>第二行第一列</td>
    			<td>第二行第二列</td>
    		</tr>
    		<tr align="left">
    			<td>第三行第一列</td>
    			<td>第三行第二列</td>
    		</tr>
    	</table>	
    	<br/>
    <!--	跨行列练习-->
    	<table border="1" cellspacing="0" width="400px">
    		<caption>课程表</caption>
    		<tr>
    			<th rowspan="2">时间\星期</th>
    			<th colspan="5">星期</th>
    		</tr>
    		<tr>
    			<th>星期一</th>
    			<th>星期二</th>
    			<th>星期三</th>
    			<th>星期四</th>
    			<th>星期五</th>
    		</tr>
    		<tr>
    			<th rowspan="2">上午</th>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    		</tr>
    		<tr>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    			<td>语文</td>
    		</tr>
    		<tr>
    			<th rowspan="2">下午</th>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    		</tr>
    		<tr>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    			<td>数学</td>
    		</tr>
    		
    	</table>
    </body>
    </html>
    
    
    展开全文
  • //复制第三行,并将复制后的行插入到表格作为第五行 TableRow row = table.getRows().get(2).deepClone(); table.getRows().insert(4,row); //保存文档 doc.saveToFile("CopyRow.docx",FileFormat.Docx_...

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长

    每天凌晨00点00分, 第一时间与你相约

    每日英文

    Destiny decides who enters your life, but you get to decide who stays.

    谁走进你的生命,是由命运决定;谁停留在你生命中,却是由你自己决定。

    每日掏心话

    人终将会变老,事物也随之变更,很多时候,一个人发现自己爱上了一个人,都是在跟他分别的时候。


    来自:E-iceblue | 责编:乐乐

    链接:cnblogs.com/Yesi/p/11691132.html

    640?wx_fmt=jpeg

    程序员小乐(ID:study_tech)第 673 次推文   图片来自网络

       正文   

    本文将对如何在Java程序中操作Word表格作进一步介绍。操作要点包括

    • 如何在Word中创建嵌套表格、

    • 对已有表格添加行或者列

    • 复制已有表格中的指定行或者列

    • 对跨页的表格可设置是否禁止跨页断行

    创建表格,包括添加数据、插入表格、合并单元格、设置表格样式、单元格居中、单元格背景色,单元格字体样式等设置,可参考这篇文章里的内容。

     

    使用工具:Free Spire.Doc for Java (免费版)

    Jar文件可通过官网下载jar文件包,下载后,解压文件,将lib文件夹下的Spire.Doc.jar导入Java程序;也可以在maven项目中通过maven仓库安装导入。

     

    添加Word嵌套表格

    import com.spire.doc.*;	
    import com.spire.doc.documents.*;	
    import com.spire.doc.fields.TextRange;	
    
    	
    
    	
    public class NestedTable {	
        public static void main(String[]args){	
            //加载测试文档	
            Document doc = new Document("sample.docx");	
    
    	
            //获取指定表格中的单元格,并设置行高、列宽	
    Section sec = doc.getSections().get(0);	
            Table table = sec.getTables().get(0);	
            table.getRows().get(0).setHeight(120f);	
            table.getRows().get(0).getCells().get(0).setWidth(380);	
    
    	
            //添加嵌套表格到指定单元格	
            Table nestedtable = table.get(0,0).addTable(true);	
            nestedtable.getTableFormat().setHorizontalAlignment(RowAlignment.Center);//设置嵌套表格在单元格中的对齐方式	
            nestedtable.resetCells(4,4);//指定嵌套表格行数、列数	
            nestedtable.autoFit(AutoFitBehaviorType.Auto_Fit_To_Contents);//设置嵌套表格内容自适应方法	
            //声明表格数组内容	
            String[][] data ={	
                    new String[]{"编号","产区","最新型号","生产日期",},	
                    new String[]{"1","A","V2.2.0","2019-06-21"},	
                    new String[]{"2","B","V2.6.1","2019-06-18"},	
                    new String[]{"3","C","V2.6.2","2019-06-14"},	
            };	
    
    	
            //填充数组内容到嵌套表格	
            for (int i = 0; i < data.length; i++) {	
                TableRow dataRow = nestedtable.getRows().get(i);	
                dataRow.getCells().get(i).setWidth(160);	
                dataRow.setHeight(25);	
                dataRow.setHeightType(TableRowHeightType.Exactly);	
                for (int j = 0; j < data[i].length; j++) {	
                    dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);	
                    TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);	
                    range.getCharacterFormat().setFontName("楷体");	
                    range.getCharacterFormat().setFontSize(11f);	
                    range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);	
                }	
            }	
    
    	
            //保存文档	
            doc.saveToFile("nesedtable1.docx",FileFormat.Docx_2010);	
        }	
    }

    嵌套表格效果:

    640?wx_fmt=png

     

    在Word表格中添加行或者列

    1. 添加行

    import com.spire.doc.*;	
    
    	
    public class AddRow {	
        public static void main(String[] args){	
            //加载测试文档	
            Document doc = new Document();	
            doc.loadFromFile("sample.docx");	
    
    	
            //获取表格	
            Section section = doc.getSections().get(0);	
            Table table = section.getTables().get(0);	
    
    	
            table.addRow();//默认在表格最下方插入一行	
            //table.getRows().insert(2,table.addRow());//在表格中第3行插入一行	
            //table.addRow(4);//默认在表格最下方添加4个单元格	
            //table.addRow(true,2);//带格式在最后一行添加2个单元格	
            //table.addRow(false,2);//不带格式在最后一行添加2个单元格	
    
    	
            //保存文档	
            doc.saveToFile("addrow.docx",FileFormat.Docx_2013);	
            doc.dispose();	
        }	
    }

    表格行添加效果:

    640?wx_fmt=png

    2. 添加列

    import com.spire.doc.*;	
    import com.spire.doc.documents.BorderStyle;	
    
    	
    import java.awt.*;	
    
    	
    public class AddColumn {	
        public static void main(String[] args){	
            //加载测试文档	
            Document doc = new Document();	
            doc.loadFromFile("sample.docx");	
    
    	
            //获取表格	
            Section section = doc.getSections().get(0);	
            Table table = section.getTables().get(0);	
    
    	
    //获取表格单元格宽度及类型	
            float width = table.get(0,0).getWidth();	
            CellWidthType type = table.get(0,0).getCellWidthType();	
            //遍历表格每一行	
            for (int i = 0; i < table.getRows().getCount(); i++) {	
                TableRow row = table.getRows().get(i);//获取表格每一行	
                Color color = row.getCells().get(0).getCellFormat().getBackColor();//获取表格单元格背景色	
                //基于表格每行,在最后添加一个单元格,并设置单元格格式	
                TableCell cell = row.addCell(true);//默认在最后一列添加单元格	
                cell.setWidth(width);	
                cell.setCellWidthType(type);	
                cell.getCellFormat().getBorders().setBorderType(BorderStyle.Single);	
                cell.getCellFormat().setBackColor(color);	
                //如需在指定位置插入列,基于以上代码并增加下面一行代码即可	
                //row.getCells().insert(2,cell);//插入一列作为第三列	
            }	
    
    	
            //保存文档	
            doc.saveToFile("addcolumn.docx", FileFormat.Docx_2013);	
            doc.dispose();	
        }	
    }

    表格列添加效果:

    640?wx_fmt=png

     

    复制Word表格中的行或者列

    1. 复制行

    import com.spire.doc.*;	
    
    	
    public class CopyRow {	
        public static void main(String[] args) {	
            //加载测试文档	
            Document doc = new Document();	
            doc.loadFromFile("test.docx");	
    
    	
            //获取表格	
            Section section = doc.getSections().get(0);	
            Table table =section.getTables().get(0);	
    
    	
            //复制第三行,并将复制后的行插入到表格作为第五行	
            TableRow row = table.getRows().get(2).deepClone();	
            table.getRows().insert(4,row);	
    
    	
            //保存文档	
            doc.saveToFile("CopyRow.docx",FileFormat.Docx_2013);	
            doc.dispose();	
        }	
    }

    表格行复制效果:

    640?wx_fmt=png

    2. 复制列

    import com.spire.doc.*;	
    
    	
    public class CopyColumn {	
        public static void main(String[] args) {	
           //加载测试文档	
            Document doc = new Document();	
            doc.loadFromFile("test.docx");	
    
    	
            //获取表格	
            Section section = doc.getSections().get(0);	
            Table table =section.getTables().get(0);	
    
    	
            //遍历表格每行	
            for (int i = 0; i < table.getRows().getCount(); i++) {	
                //复制表格中每行的最后一个单元格,复制	
                TableRow row = table.getRows().get(i);	
                TableCell cell = (TableCell) row.getCells().getLastItem().deepClone();	
                //row.getCells().add(cell);//默认在每行最后添加复制后的单元格	
                row.getCells().insert(2,cell);//在指定位置插入复制后的单元格	
            }	
    
    	
            //保存文档	
            doc.saveToFile("CopyColumn1.docx",FileFormat.Docx_2013);	
            doc.dispose();	
        }	
    }

    表格列复制效果:

    640?wx_fmt=png

     

    设置Word表格是否禁止跨页断行

    这里通过两种方式来设置防止表格跨页出现断行的效果,供参考。

     1. 设置属性禁止跨页断行

    import com.spire.doc.*;	
    
    	
    public class PreventPagebreak {	
        public static void main(String[]args){	
            //加载测试文档	
            Document doc= new Document("test.docx");	
    
    	
            //获取表格	
            Table table = doc.getSections().get(0).getTables().get(0);	
    
    	
            //设置表格是否分页断行	
            table.getTableFormat().isBreakAcrossPages(false);	
    
    	
            //保存文档	
            doc.saveToFile("result.docx",FileFormat.Docx_2013);	
        }	
    }

    2. 保持表格内容在同一页面

    
                                                        

    640?wx_fmt=png

    欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

    猜你还想看

    640?wx_fmt=png

    展开全文
  • Java利用poi生成word(包含插入图片,动态表格合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: import java.io.FileInputStream; import java.io...

    Java利用poi生成word(包含插入图片,动态表格,行合并)

    测试模板样式:
    在这里插入图片描述
    图表 1
    Word生成结果:
    在这里插入图片描述
    图表 2
    需要的jar包:(具体jar可自行去maven下载)
    在这里插入图片描述
    Test测试类:

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            //需要进行文本替换的信息
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("${date}", "2018-03-06");
            data.put("${name}", "东方明珠");
            data.put("${address}", "华东院");
            data.put("${communityvalue}", "");
            data.put("${safetycode}", "华东院");
            data.put("${picture2}", "");
            data.put("${picture3}", "");
            data.put("${buildingvalue2}", "华东院");
            data.put("${patrolPhoto1}", "");
            data.put("${patrolPhoto2}", "");
            data.put("${buildingvalue3}", "中国");
    
            //图片,如果是多个图片,就新建多个map
            Map<String,Object> picture1 = new HashMap<String, Object>();
            picture1.put("width", 100);
            picture1.put("height", 150);
            picture1.put("type", "jpg");
            picture1.put("content", WorderToNewWordUtils.inputStream2ByteArray(new FileInputStream("D:/timg.jpg"), true));
            data.put("${picture1}",picture1);
    
            //需要进行动态生成的信息
            List<Object> mapList = new ArrayList<Object>();
    
            //第一个动态生成的数据列表
            List<String[]> list01 = new ArrayList<String[]>();
            list01.add(new String[]{"A","11111111111","22","22"});
            list01.add(new String[]{"A","22222222222","33","22"});
            list01.add(new String[]{"B","33333333333","44","22"});
            list01.add(new String[]{"C","44444444444","55","22"});
    
            //第二个动态生成的数据列表
            List<String[]> list02 = new ArrayList<String[]>();
            list02.add(new String[]{"A","11111111111","22","22"});
            list02.add(new String[]{"d","22222222222","33","22"});
            list02.add(new String[]{"B","33333333333","44","22"});
            list02.add(new String[]{"C","44444444444","55","22"});
    
            mapList.add(list01);
            mapList.add(list02);
    
            //需要动态改变表格的位置;第一个表格的位置为0
            int[] placeList = {1,4};
    
            CustomXWPFDocument doc = WorderToNewWordUtils.changWord("C:/Users/user/Desktop/test1.docx",data,mapList,placeList);
            FileOutputStream fopts = new FileOutputStream("D:/呵呵.docx");
            doc.write(fopts);
            fopts.close();
        }
    
    }
    

    WorderToNewWordUtils类:

    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.xwpf.usermodel.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
    
    /**
     * Created by 王景伟 on 2018/12/19.
     */
    public class WorderToNewWordUtils {
        /**
         * 根据模板生成word文档
         * @param inputUrl 模板路径
         * @param textMap 需要替换的文本内容
         * @param mapList 需要动态生成的内容
         * @return
         */
        public static CustomXWPFDocument changWord(String inputUrl, Map<String, Object> textMap, List<Object> mapList,int[] placeList) {
            CustomXWPFDocument document = null;
            try {
                //获取docx解析对象
                document = new CustomXWPFDocument(POIXMLDocument.openPackage(inputUrl));
    
                //解析替换文本段落对象
                WorderToNewWordUtils.changeText(document, textMap);
    
                //解析替换表格对象
                WorderToNewWordUtils.changeTable(document, textMap, mapList,placeList);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return document;
        }
    
        /**
         * 替换段落文本
         * @param document docx解析对象
         * @param textMap 需要替换的信息集合
         */
        public static void changeText(CustomXWPFDocument document, Map<String, Object> textMap){
            //获取段落集合
            List<XWPFParagraph> paragraphs = document.getParagraphs();
    
            for (XWPFParagraph paragraph : paragraphs) {
                //判断此段落时候需要进行替换
                String text = paragraph.getText();
                if(checkText(text)){
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (XWPFRun run : runs) {
                        //替换模板原来位置
                        Object ob = changeValue(run.toString(), textMap);
                        System.out.println("段落:"+run.toString());
                        if (ob instanceof String){
                            run.setText((String)ob,0);
                        }
                    }
                }
            }
        }
    
        /**
         * 替换表格对象方法
         * @param document docx解析对象
         * @param textMap 需要替换的信息集合
         * @param mapList 需要动态生成的内容
         */
        public static void changeTable(CustomXWPFDocument document, Map<String, Object> textMap, List<Object> mapList,int[] placeList){
            //获取表格对象集合
            List<XWPFTable> tables = document.getTables();
    
            //循环所有需要进行替换的文本,进行替换
            for (int i = 0; i < tables.size(); i++) {
                XWPFTable table = tables.get(i);
                if(checkText(table.getText())){
                    List<XWPFTableRow> rows = table.getRows();
                    System.out.println("简单表格替换:"+rows);
                    //遍历表格,并替换模板
                    eachTable(document,rows, textMap);
                }
            }
    
            int index=0;
            //操作word中的表格
            for (int i = 0; i < tables.size(); i++) {
                //只处理行数大于等于2的表格,且不循环表头
                XWPFTable table = tables.get(i);
                if(placeList[index]==i){
                    List<String[]> list = (List<String[]>) mapList.get(index);
                    //第二个表格使用daList,插入数据
                    if (null != list && 0 < list.size()){
                        insertTable(table, null,list,2);
                        List<Integer[]> indexList = startEnd(list);
                        for (int c=0;c<indexList.size();c++){
                            //合并行
                            mergeCellVertically(table,0,indexList.get(c)[0]+1,indexList.get(c)[1]+1);
                        }
                    }
                    index++;
                }
    
            }
        }
        /**
         * 遍历表格
         * @param rows 表格行对象
         * @param textMap 需要替换的信息集合
         */
        public static void eachTable(CustomXWPFDocument document, List<XWPFTableRow> rows , Map<String, Object> textMap){
            for (XWPFTableRow row : rows) {
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    //判断单元格是否需要替换
                    if(checkText(cell.getText())){
                        List<XWPFParagraph> paragraphs = cell.getParagraphs();
                        for (XWPFParagraph paragraph : paragraphs) {
                            List<XWPFRun> runs = paragraph.getRuns();
                            for (XWPFRun run : runs) {
                                Object ob = changeValue(run.toString(), textMap);
                                if (ob instanceof String){
                                    run.setText((String)ob,0);
                                }else if (ob instanceof Map){
                                    run.setText("",0);
                                    Map pic = (Map)ob;
                                    int width = Integer.parseInt(pic.get("width").toString());
                                    int height = Integer.parseInt(pic.get("height").toString());
                                    int picType = getPictureType(pic.get("type").toString());
                                    byte[] byteArray = (byte[]) pic.get("content");
                                    ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
                                    try {
                                        int ind = document.addPicture(byteInputStream,picType);
                                        document.createPicture(ind, width , height,paragraph);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    
        /**
         * 为表格插入数据,行数不够添加新行
         * @param table 需要插入数据的表格
         * @param tableList 第四个表格的插入数据
         * @param daList 第二个表格的插入数据
         * @param type 表格类型:1-第一个表格 2-第二个表格 3-第三个表格 4-第四个表格
         */
        public static void insertTable(XWPFTable table, List<String> tableList,List<String[]> daList,Integer type){
            if (2 == type){
                //创建行和创建需要的列
                for(int i = 1; i < daList.size(); i++){
                    //添加一个新行
                    XWPFTableRow row = table.insertNewTableRow(1);
                    for(int k=0; k<daList.get(0).length;k++){
                        row.createCell();//根据String数组第一条数据的长度动态创建列
                    }
                }
    
                //创建行,根据需要插入的数据添加新行,不处理表头
                for(int i = 0; i < daList.size(); i++){
                    List<XWPFTableCell> cells = table.getRow(i+1).getTableCells();
                    for(int j = 0; j < cells.size(); j++){
                        XWPFTableCell cell02 = cells.get(j);
                        cell02.setText(daList.get(i)[j]);
                    }
                }
            }else if (4 == type){
                //插入表头下面第一行的数据
                for(int i = 0; i < tableList.size(); i++){
                    XWPFTableRow row = table.createRow();
                    List<XWPFTableCell> cells = row.getTableCells();
                    cells.get(0).setText(tableList.get(i));
                }
            }
        }
    
        /**
         * 判断文本中时候包含$
         * @param text 文本
         * @return 包含返回true,不包含返回false
         */
        public static boolean checkText(String text){
            boolean check  =  false;
            if(text.indexOf("$")!= -1){
                check = true;
            }
            return check;
        }
    
        /**
         * 匹配传入信息集合与模板
         * @param value 模板需要替换的区域
         * @param textMap 传入信息集合
         * @return 模板需要替换区域信息集合对应值
         */
        public static Object changeValue(String value, Map<String, Object> textMap){
            Set<Map.Entry<String, Object>> textSets = textMap.entrySet();
            Object valu = "";
            for (Map.Entry<String, Object> textSet : textSets) {
                //匹配模板与替换值 格式${key}
                String key = textSet.getKey();
                if(value.indexOf(key)!= -1){
                    valu = textSet.getValue();
                }
            }
            return valu;
        }
    
        /**
         * 将输入流中的数据写入字节数组
         * @param in
         * @return
         */
        public static byte[] inputStream2ByteArray(InputStream in, boolean isClose){
            byte[] byteArray = null;
            try {
                int total = in.available();
                byteArray = new byte[total];
                in.read(byteArray);
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(isClose){
                    try {
                        in.close();
                    } catch (Exception e2) {
                        System.out.println("关闭流失败");
                    }
                }
            }
            return byteArray;
        }
    
        /**
         * 根据图片类型,取得对应的图片类型代码
         * @param picType
         * @return int
         */
        private static int getPictureType(String picType){
            int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
            if(picType != null){
                if(picType.equalsIgnoreCase("png")){
                    res = CustomXWPFDocument.PICTURE_TYPE_PNG;
                }else if(picType.equalsIgnoreCase("dib")){
                    res = CustomXWPFDocument.PICTURE_TYPE_DIB;
                }else if(picType.equalsIgnoreCase("emf")){
                    res = CustomXWPFDocument.PICTURE_TYPE_EMF;
                }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){
                    res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
                }else if(picType.equalsIgnoreCase("wmf")){
                    res = CustomXWPFDocument.PICTURE_TYPE_WMF;
                }
            }
            return res;
        }
    
        /**
         * 合并行
         * @param table
         * @param col 需要合并的列
         * @param fromRow 开始行
         * @param toRow 结束行
         */
        public static void mergeCellVertically(XWPFTable table, int col, int fromRow, int toRow) {
            for(int rowIndex = fromRow; rowIndex <= toRow; rowIndex++){
                CTVMerge vmerge = CTVMerge.Factory.newInstance();
                if(rowIndex == fromRow){
                    vmerge.setVal(STMerge.RESTART);
                } else {
                    vmerge.setVal(STMerge.CONTINUE);
                }
                XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
                CTTcPr tcPr = cell.getCTTc().getTcPr();
                if (tcPr != null) {
                    tcPr.setVMerge(vmerge);
                } else {
                    tcPr = CTTcPr.Factory.newInstance();
                    tcPr.setVMerge(vmerge);
                    cell.getCTTc().setTcPr(tcPr);
                }
            }
        }
        /**
         * 获取需要合并单元格的下标
         * @return
         */
        public static List<Integer[]> startEnd(List<String[]> daList){
            List<Integer[]> indexList = new ArrayList<Integer[]>();
    
            List<String> list = new ArrayList<String>();
            for (int i=0;i<daList.size();i++){
                list.add(daList.get(i)[0]);
            }
            Map<Object, Integer> tm = new HashMap<Object, Integer>();
            for (int i=0;i<daList.size();i++){
                if (!tm.containsKey(daList.get(i)[0])) {
                    tm.put(daList.get(i)[0], 1);
                } else {
                    int count = tm.get(daList.get(i)[0]) + 1;
                    tm.put(daList.get(i)[0], count);
                }
            }
            for (Map.Entry<Object, Integer> entry : tm.entrySet()) {
                String key = entry.getKey().toString();
                String value = entry.getValue().toString();
                if (list.indexOf(key) != (-1)){
                    Integer[] index = new Integer[2];
                    index[0] = list.indexOf(key);
                    index[1] = list.lastIndexOf(key);
                    indexList.add(index);
                }
            }
            return indexList;
        }
    
    }
    

    CustomXWPFDocument类:

    import org.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * Created by 王景伟 on 2018/12/19.
     * 自定义 XWPFDocument,并重写 createPicture()方法
     */
    public class CustomXWPFDocument extends XWPFDocument{
        public CustomXWPFDocument(InputStream in) throws IOException {
            super(in);
        }
    
        public CustomXWPFDocument() {
            super();
        }
    
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {
            super(pkg);
        }
    
        /**
         * @param id
         * @param width 宽
         * @param height 高
         * @param paragraph  段落
         */
        public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            String blipId = getAllPictures().get(id).getPackageRelationship().getId();
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
    
            System.out.println(blipId+":"+inline);
    
            String picXml = ""
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + id
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + blipId
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>"
                    + "   </a:graphicData>" + "</a:graphic>";
    
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
    
            inline.setDistT(0);
            inline.setDistB(0);
            inline.setDistL(0);
            inline.setDistR(0);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + id);
            docPr.setDescr("测试");
        }
    }
    

    方法调用:

    1. 导入jar包

    2. 复制以上CustomXWPFDocument类和WorderToNewWordUtils类到项目合适路径(根据自己项目情况判断)

    3. 主类调用方法说明(既以上Test测试类)

    4. 对于一般的字段替换,只需要保持(key,value)的键值对方式赋值替换即可,key和模板占位字符保持一致,例:

      Map<String, Object> data = new HashMap<String, Object>();
      data.put(" d a t e &quot; , &quot; 2018 − 03 − 06 &quot; ) ; d a t a . p u t ( &quot; {date}&quot;, &quot;2018-03-06&quot;); data.put(&quot; date","20180306");data.put("{name}", “东方明珠”);
      data.put(" a d d r e s s &quot; , &quot; 华 东 院 &quot; ) ; d a t a . p u t ( &quot; {address}&quot;, &quot;华东院&quot;); data.put(&quot; address","");data.put("{communityvalue}", “”);
      data.put(" s a f e t y c o d e &quot; , &quot; 华 东 院 &quot; ) ; d a t a . p u t ( &quot; {safetycode}&quot;, &quot;华东院&quot;); data.put(&quot; safetycode","");data.put("{picture2}", “”);
      data.put(" p i c t u r e 3 &quot; , &quot; &quot; ) ; d a t a . p u t ( &quot; {picture3}&quot;, &quot;&quot;); data.put(&quot; picture3","");data.put("{buildingvalue2}", “华东院”);
      data.put(" p a t r o l P h o t o 1 &quot; , &quot; &quot; ) ; d a t a . p u t ( &quot; {patrolPhoto1}&quot;, &quot;&quot;); data.put(&quot; patrolPhoto1","");data.put("{patrolPhoto2}", “”);
      data.put("${buildingvalue3}", “中国”);

    5. 如果需要插入图片,则需要重新创建一个Map集合存储图片数据:例

      Map<String,Object> picture1 = new HashMap<String, Object>();
      picture1.put(“width”, 100);
      picture1.put(“height”, 150);
      picture1.put(“type”, “jpg”);
      picture1.put(“content”, WorderToNewWordUtils.inputStream2ByteArray(new FileInputStream(“D:/timg.jpg”), true));
      data.put("${picture1}",picture1);

    如果有多张图片,则需要创建多个Map保存图片,其中它的属性值应保持不变(如上:width,height,type,content),需要注意的是对于一般字段或者是图片最终都存储在data集合中,如下:

    Map<String, Object> data = new HashMap<String, Object>();
    
    1. 对于需要根据具体数据动态生成的表格,我们将数据存储在一个List集合中,如:

      //第一个动态生成的数据列表
      List<String[]> list01 = new ArrayList<String[]>();
      list01.add(new String[]{“A”,“11111111111”,“22”,“22”});
      list01.add(new String[]{“A”,“22222222222”,“33”,“22”});
      list01.add(new String[]{“B”,“33333333333”,“44”,“22”});
      list01.add(new String[]{“C”,“44444444444”,“55”,“22”});

      //第二个动态生成的数据列表
      List<String[]> list02 = new ArrayList<String[]>();
      list02.add(new String[]{“A”,“11111111111”,“22”,“22”});
      list02.add(new String[]{“d”,“22222222222”,“33”,“22”});
      list02.add(new String[]{“B”,“33333333333”,“44”,“22”});
      list02.add(new String[]{“C”,“44444444444”,“55”,“22”});

      如上是两个我们需要根据具体数据动态生成的表格,如list01中数据,当list中String数组的第一个字段相同时,则在创建动态表格时会将这两个单元格合并,其他列数值相同不影响合并。注意:这里的创建的String数组的列数应该和模板的表格列数保持一致。数据保存好之后将list数组统一保存在mapList中,如下:
      List mapList = new ArrayList();
      注意:
      由于无法动态获取需要动态填充的表格,所以我们定义了一个静态数组保存需要动态生成的表格的位置,如下:

      //需要动态改变表格的位置;第一个表格的位置为0

      int[] placeList = {1,4};

    如图1所示,从上至下表格所在位置分别是0-4;而我们需要动态生成的是第二个和第五个,故此处传参{1,4}
    最后调用方法导出word即可;如下:

    CustomXWPFDocument doc = WorderToNewWordUtils.changWord("C:/Users/user/Desktop/test1.docx",data,mapList,placeList);
    FileOutputStream fopts = new FileOutputStream("D:/呵呵.docx");
    doc.write(fopts);
    fopts.close();
    

    在changeWord方法中,第一个参数是模板路径,第二个参数是填充数据,第三个参数是动态表格填充数据,第四个参数是动态表格位置;

    友情提醒:(以下内容若需要可采纳,不需要可跳过)
    使用poi生成Word会发生分段混乱的问题,例如:在操作POI替换word时发现getRuns将我们预设的${product}自动切换成了成了两个部分
    ${product } 或者 p r o d u c t 既 会 出 现 空 格 分 离 字 段 的 情 况 ; 建 议 使 用 从 左 往 右 的 顺 序 进 行 模 板 字 段 填 充 ( 既 : { product } 既会出现空格分离字段的情况;建议使用从左往右的顺序进行模板字段填充(既: product使→{→product→} 而不是 $→{→}→product的方式);

    亲测有效:使用notepad++的xml插件修改模板(保证解析完美)
    (一) 安装notepad++并为其添加插件XML Tools插件(具体步骤自行百度)
    (二) 将修改好的word模板另存为xml格式的文档;如下图所示
    在这里插入图片描述
    (三) 使用notepad++打开xml模板,刚开始打开是一个毫无逻辑可寻的文件,这时我们使用xml tools工具格式化xml文件:如下:
    在这里插入图片描述
    (四) 如上图可看出模板被解析成了多部分,此时我们修改文件,让其保持为一个字段:如下
    在这里插入图片描述

    (五) 保存文档之后用word打开xml文档,然后另存为所需要的docx格式word即可

    create by 王景伟
    2018-12-19

    展开全文
  • 文章目录表格表格的基本结构构成表格的三个基本要素表格的属性跨与跨列表格的其它元素和属性列表无序列表有序列表自定义列表表单(h5)form元素input标签的属性type的属性值下拉框标签其它属性fieldset/legend元素...
  • css表格分两Starting Note: 开始说明: Editing and styling go hand in hand during the development of a web page or a website. While you are editing an element of your web page or website you must ...
  • python 图片中的表格识别

    万次阅读 多人点赞 2018-07-09 14:15:35
    表格图片的内容识别 接到个任务需要将几万张带表格的图片转换成结构化数据。 1. 大步骤 最终算是完成任务,但是识别率上还有一点问题,人工再过一下,还是蛮快的。先说一下大的步骤: 1. 分割单元格...
  • elementUI table 实现表格展示只展示一 表格加入 :row-key='getRowKeys' :expand-row-keys="expands" @expand-change="expandSelect" data加入 data:{ expands: [], }, methods加入 getRowKeys(row) { ...
  • PHP利用GD库把数据生成图片表格

    千次阅读 2018-04-30 12:11:57
    先上生成的效果,免得不是各位看官要的效果所有参数单独配置,$params为动态参数,$base为静态参数,很容易扩展成多行多表格 /** * 生成表格 */ public function create_table($params) { $data = array();...
  • 学习Latex,有时不需要纠结每一代码的含义...图片表格的引用 使用Latex写论文,最大的优点主要有三个:1)可以利用代码方便地编辑公式;2)插入图表、公式不需要自己费心思排版,也不需要手动对图表和公式编号...
  • Bootstrap之表格,按钮,表单和图片的样式本文中,都是结合本人的学习Bootstrap时所做的练习,来理解通过内置的 CSS 定义,Bootstrap的表格,按钮,表单和图片是如何来显示各种丰富效果的。 一. 表格 基本格式...
  • th是表格。 td是表格 border是table标签的属性,border要写在table标签的后面并且属性和标签之间要要隔一个空格。比如:<标签属性="属性值"> 下面是table标签的一些属性: celllpadding表...
  • 废话不多说,直接上代码,上效果图 @RestController ...//图片上传地址 @Value("${queryurl}") private String queryurl; private int indexExport = 0; private int indexExportCell = 0; private Map<
  • html中表格table的行列合并问题解决

    千次阅读 2015-02-27 19:51:30
    因为要做个网站,里面的内容除了大段文字之外,还有大量的表格,这就发现了表格排版的问题。 一般简单的表格,例如:                             这种形式就比较简单,只要简单地...
  • 生成一个简单的PDF报表:含图片表格,文字
  •  table是表格标签,tr是一,td是一个单元格 二、tabel表格标签属性 1、table表格标签的基础属性  第一、width属性:定义表格的宽度,宽度有两种情况:一种是精确值,比如500,不会随着浏览器的缩减或增大而...
  • 计算与推断思维 表格

    万次阅读 2017-11-18 21:05:17
    表格 原文:Tables 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 表格是表示数据集的基本对象类型。 表格可以用两种方式查看: 具名列的序列,每列都描述数据集中所有条目的一个方面,或者 ...
  • 之前在做一个C#项目需要对word文档的表格进行数据填充,然后代码调用打印。...这里重点说针对表格的插入图片,这个网上找不到,完全我自己摸索出来的。有更好的方法欢迎指正。using Spire.Doc; usin...
  • 该文章讲述了如何使用VS2012引用COM中Miscrosoft Word 14.0 Object Library实现创建文档,添加表格图片,因为我在C#联系数据库做销售系统中需要打印表单,我想以图表形式显示在word中,同时生成相应的饼状图或柱状图,...
  • ![图片说明](https://img-ask.csdn.net/upload/201903/22/1553262585_363805.jpg) 就如图中那个样子
  • 图片标签(单标签 ,行内标签) 图片的语法:<img 属性名=”属性值”/> 图片的属性 l图片的路径 src=”图片的地址”(1.网上url 2.本地的绝对地址 3.本地的相对地址<同一个文件夹下同一个地址>) l...
  • LaTeX学习笔记 写在最前面:LaTeX的注释符 界面字体放大 一、环境搭建与RUN 二、基本结构 三、设置表格 、文字变形及符号 、插入图片 附录、一些小tip LaTeX是一个可以用于文字编辑及排版的软件, 与Word相比,...
  • HTML 表格

    千次阅读 2018-10-18 09:33:05
    HTML 表格 1、作用 以表格形式将数据显示出来,当数据量非常大的...tr定义 td定义单元格 &lt;table width=* height=* bgcolor=* border=* bordercolor=* cellspacing=* cellpadding=*&gt; &lt;bo...
  • 注意如果是需要循环插入数据,制作的表格模版需要一全部输入井号#,格式样式可以对#设置 表格中${header}和${hearder2}是放入需要替换的图片 替换数据的格式样式同$的一样 如果需要根据数据再确定需要在哪替换...
  • layui 数据表格 table 操作表格数列

    千次阅读 2018-11-16 16:03:34
    -- 操作 --> <table class="layui-hidden" id="treeTable" lay-filter="treeTable"></table> (null);"><i class="layui-icon layui-icon-add-1"></i>增加 ...
  • 使用GridView表格显示多张图片

    千次阅读 2015-12-30 16:06:08
    1:主题:使用GridView以表格形式显示多张图片 2:课程目标:学会使用GridView制作二维布局界面(分布) 3:GridView用来干嘛:用于在界面上按分布的方式来显示多个组件; 应用举例:手机系统桌面、...
  • python处理表格-python表格处理

    千次阅读 2020-11-01 13:12:51
    应懒癌朋友的要求,在这整理一下之前发过的几篇关于 excel 表格处理以及 pdf 文件相关的文章,如有需要自取哈~excel 表格处理相关: 用 python 整理 excel 表格 摘要:将一份表格文件中不同 sheet 单页面中的数据...
  • 修改多选按钮默认样式,使input隐藏,添加UI设计给你的样式图片到标签i中,设置为背景图片。因为CheckBox默认样式是没有办法修改的 在表格里面实现按钮的全选,点击标题栏,实现全选,或者点击表格每一,也可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,723
精华内容 15,089
关键字:

五行四列的表格图片