精华内容
下载资源
问答
  • freemarker 导出word表格

    2017-07-27 16:16:22
    word编好格式,另存为xml文件,修改变量,修改成.ftl模版,然后赛数据导出。
  • POI 导出 Word 表格

    千次阅读 2017-08-13 17:21:37
    项目需求,需要将页面上的报表导出Word文档。

    项目需求,需要将页面上的报表导出Word文档。


    一、报表如下:



    二、主要实现代码

    1.导出Util类

    package com.yhksxt.util;
    
    
    import java.io.IOException;
    import java.math.BigInteger;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
    
    
    public class ExprotSTUtil {
    
    
    
    
    
    public  void exportSTToWord(String titleName,String[][] list ,HttpServletResponse response) throws IOException{
    //创建document对象
    XWPFDocument document = new XWPFDocument();
    
    //添加标题
    XWPFParagraph titleParagraph = document.createParagraph();
    //设置段落居中  
           titleParagraph.setAlignment(ParagraphAlignment.CENTER); 
           XWPFRun titleParagraphRun = titleParagraph.createRun();  
           titleParagraphRun.setText(titleName);  
           titleParagraphRun.setColor("000000");  
           titleParagraphRun.setFontSize(20);  
    //创建表格
              int row = list.length +2;
              int column = list[0].length +3;
              XWPFTable table = document.createTable(row,column);
              setTableWidth(table, "10000"); 
           
              //处理表达合并和数据填充
              
              //合并列
              mergeCellsVertically(table, 0, 0, 1);
              mergeCellsVertically(table, 2, 0, 1);
              mergeCellsVertically(table, column-1, 0, 1);
              
              //合并行
              for(int i=0;i<row-2;i++){
              mergeCellsHorizontal(table, i, 0, 1);
                  mergeCellsHorizontal(table, i, 2, 4);
              }
              
              mergeCellsHorizontal(table, 0, 5, column-2);
              mergeCellsHorizontal(table, row-2, 0, 4);
              mergeCellsHorizontal(table, row-1, 0, 4);
              mergeCellsHorizontal(table, row-1, 5, column-1);
              
              //填充数据
              XWPFTableRow rowIndex = table.getRow(0);
              XWPFTableCell cell = rowIndex.getCell(0);
              cell.setText(list[0][0]);
              XWPFTableCell cell1 = rowIndex.getCell(2);
            cell1.setText(list[0][1]);
            XWPFTableCell cell2 = rowIndex.getCell(5);
            cell2.setText("试题类型及题量");
            XWPFTableCell cell3 = rowIndex.getCell(column-1);
            cell3.setText(list[0][list[0].length-1]);
             
            XWPFTableRow rowIndex1 = table.getRow(1);
            for(int j=5,i=2;j<column-1;j++,i++){
            XWPFTableCell cell4 = rowIndex1.getCell(j);
            cell4.setText(list[0][i]);
            }
             
            for(int i = 2,ii=1;i<row-1;i++,ii++){
            XWPFTableRow rowIndex2 = table.getRow(i);
            for(int j = 0,jj=0;j<column-1 ;j++){
            XWPFTableCell cell4 =null;
            if(j==0){
            cell4 =rowIndex2.getCell(j);
            cell4.setText(list[ii][jj]);
            jj++;
            }if(j==2){
            cell4 =rowIndex2.getCell(j);
            cell4.setText(list[ii][jj]);
            jj++;
            }else if(j>=5){
            cell4 =rowIndex2.getCell(j);
            cell4.setText(list[ii][jj]);
              jj++;
            }
            }
            }
             
            XWPFTableRow rowIndex3 = table.getRow(row-1);
            XWPFTableCell cell5 =rowIndex3.getCell(0);
            cell5.setText("其他需要说明的问题");
                  
              document.write(response.getOutputStream());
    }
    
     
    /***
    *  跨行合并  
    * @param table
    * @param col  合并列
    * @param fromRow 起始行
    * @param toRow   终止行
    */
    private void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {  
           for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {  
               XWPFTableCell cell = table.getRow(rowIndex).getCell(col);  
               if ( rowIndex == fromRow ) {  
                   // The first merged cell is set with RESTART merge value  
                   cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);  
               } else {  
                   // Cells which join (merge) the first one, are set with CONTINUE  
                   cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);  
               }  
           }  
       }
    
    /***
    * 跨列合并 
    * @param table
    * @param row 所合并的行
    * @param fromCell  起始列
    * @param toCell   终止列
    */
    private  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {  
           for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {  
               XWPFTableCell cell = table.getRow(row).getCell(cellIndex);  
               if ( cellIndex == fromCell ) {  
                   // The first merged cell is set with RESTART merge value  
                   cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);  
               } else {  
                   // Cells which join (merge) the first one, are set with CONTINUE  
                   cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);  
               }  
           }  
       }  
       
    
    /***
    * 导出word 设置行宽
    * @param table
    * @param width
    */
    private  void setTableWidth(XWPFTable table,String width){  
            CTTbl ttbl = table.getCTTbl();  
            CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();  
            CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();  
            CTJc cTJc=tblPr.addNewJc();  
            cTJc.setVal(STJc.Enum.forString("center"));  
            tblWidth.setW(new BigInteger(width));  
            tblWidth.setType(STTblWidth.DXA);  
        }  
    }


    2.controller中测试方法

    @RequestMapping(value = "exprotWord")
    public void exprotWord(HttpServletRequest request,HttpServletResponse response,String judge,String titleName,String subjectId)
    throws IOException , Exception {
    String fileName =null;
    String[][] list = null;
    System.out.println(judge);
    if(judge.equals("tlbb")){
    list = questionService.getSubjectZhangTotal(subjectId);//页面所有显示内容
    titleName = titleName + "题量报表";
    }else if(judge.equals("blbb")){
    String[][] tllist = questionService.getSubjectZhangTotal(subjectId);
    list = questionService.getxkblbbBytlbb(tllist);//转成比例
    titleName = titleName + "比例报表";
    }else {
    return;
    }
    fileName = titleName+".docx";
    // 设置文件MIME类型
    response.setContentType(request.getServletContext().getMimeType(fileName));
    // 设置Content-Disposition
    response.setHeader("Content-Disposition",
    "attachment; fileName=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
    ExprotSTUtil exprotWord = new ExprotSTUtil();
    exprotWord.exportSTToWord(titleName, list, response);
    }



    三、导出效果




    四、值得探讨问题

    1.报表通过jsp页面显示,数据存储问题。

    报表牵涉到对数据的统计,往往比较复杂。本列中,对每个学科下,Question表中所有题统计。牵涉到Chapter表中改学科对应的章节、Theme表中该学科对应的题型。每个题又有专属的学科、章节。并且学科中的题型、章节都是管理员可以增添删除的,所有数据都是动态的,这也就增加了处理的难度。在不确定题都所属哪个章节、哪个章节下的题型。同时也是报表所需,必须统计所有该章节,题型。查出的题后台处理后添加。    业务逻辑相对复杂一点,所以最后不要把数据都传到前端,在前端处理。所以,我采取把所有显示看到的数据,后台处理,存储到二维数组中,前台遍历一下,全部显示。   刚刚入门,这肯定不是最好的方法,感觉有好的建议,希望大神们提出,给予指导,拜谢。

    2.导出word时,对所建的table合并单元格,该合并的单元格行列坐标为多少?(以至于怎么去赋值)

           细心的朋友,应该已经发现上面代码中有一个疑问。在我添加题量总和那一行时,是和上面一起遍历的。而我list【row-1】【0】= "题量总和",list【row-1】【1】= “”,但是我的表格此之间已经合并了。 合并后的表格数据是怎么传进去的,是两个list【row-1】【0】+ list【row-1】【1】值拼接后传进去的。还是单独取的list【row-1】【0】中的值。毕竟中在row-1行每一列都赋值一遍,而在此之前前两列已经合并。    肯定有明白的大神。 像我一样的小白,可以没事的时候自己测试下。 


    五、参考





    展开全文
  • C# 操作word表格合并单元格

    千次阅读 2018-07-11 10:55:52
    C# 操作word表格遇到合并单元格的时候,假设表格是3行6列newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));//合并第1行第1列到横向单元格合并,使用如下语句 newTable.Cell(1, 3).Merge(newTable.Cell(1, 4));...

    C# 操作word表格

    遇到合并单元格的时候,假设表格是3行6列

    newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));//合并第1行第1列到横向单元格合并,使用如下语句
    
    newTable.Cell(1, 3).Merge(newTable.Cell(1, 4));
    newTable.Cell(2, 4).Merge(newTable.Cell(2, 5));

    最后表格如下图


    可以看到,横向合并单元格的时候,列号会往右移动。

    但是如果是竖向合并单元格的话,就不是这样了。

    还是这个表,如果想达到下面这个效果的话


    使用下面的语句就会报错

    newTable.Cell(2, 1).Merge(newTable.Cell(3, 1));
    newTable.Cell(3, 1).Merge(newTable.Cell(5, 1));//这句会报错

    出错提示:对 COM 组件的调用返回了错误 HRESULT E_FAIL

    究其原因在于,竖向合并单元格的时候,单元格的名称不会改变。如下图


    之前的单元格Cell(4, 1)还存在。
    正确的代码应该是这样:
     newTable.Cell(2, 1).Merge(newTable.Cell(3, 1));
     newTable.Cell(4, 1).Merge(newTable.Cell(6, 1));
    具体原因可以看这个文章:https://blog.csdn.net/p656456564545/article/details/49123043点击打开链接

    展开全文
  • Excel中的表格复制粘贴到word中格式很容易发生变化,在word中调整起来也比较麻烦,下面告诉大家如何将excel表格转到word格式。1、打开excel表格,点击左上角的“office 按钮”;2、点击如下图的“另存为”,选择...

    Excel中的表格复制粘贴到word中格式很容易发生变化,在word中调整起来也比较麻烦,下面告诉大家如何将excel表格转到word格式。

    1、打开excel表格,点击左上角的“office 按钮”;

    0b4a377549c3f731013b509d60b91315.png

    2、点击如下图的“另存为”,选择“其他格式”;

    47bc1f62ce5bf1429e89761df6b936a5.png

    3、在弹出的窗口中,点击“保存类型”后面的倒三角形,选择“单个文件网页(*mht:*mhtml)”。

    594cff8cd6c2d205366814b6d412b1e2.png

    4、选择后,再点击“选择(E)工作表”,然后点击保存;

    134092f5f745d91b5cc16d37f7f74676.png

    5、保存后关闭当前的excel表格,找到刚刚保存的那个“单个文件网页(*mht:*mhtml)”的文档,右键点击这个文件;

    6a52f9235244928cd5bd1bb332ce1ea5.png

    6、点击“打开方式”,选择用“word”打开;

    91005b78a3d44d69f7313589e371a8b8.png

    7、打开后,点击word左上角的“office 按钮”,点击“另存为”,然后选择后面的“word文档”;

    c41614e9ba7f968379dce6e06b222652.png

    8、输入文件名,并保留文件名后的“docx”的格式后缀,点击保存;

    9829ee383debba84ce4d38e5b133da1f.png

    9、点击保存后,再看表格就已经粘贴到word中了,格式是不是也很舒服;

    0d8f9d460114f2bb36ef7ca6ea5f26b4.png

    到此,大家应该知道将excel中的表格复制到word中,并保存格式不变的方法了,是不是很简单。

    同样,word文档转成excel文件也是类似的方法,只不过过程是反的而已。

    展开全文
  • 工作常用的excel,word导出,需要引入下面的6个主要包,和主要包依赖的其他包 ,可以看下面的表格进行依赖下载引入 这下面的两张图是主要包对应涉及到功能,可以按需要进行引入,有些真的用不到的主要包可以不引入 ...

    1.引入word导出所需依赖包

    工作常用的excel,word导出,需要引入下面的6个主要包,和主要包依赖的其他包 ,可以看下面的表格进行依赖下载引入
    在这里插入图片描述
    这下面的两张图是主要包对应涉及到功能,可以按需要进行引入,有些真的用不到的主要包可以不引入
    在这里插入图片描述
    在这里插入图片描述

    2.引入工具类

    1.util类

    package com.management.util;
    
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.xwpf.usermodel.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
    
    /**
     * Created by wfg 2020-08-12
     */
    public class ExportWordUtil {
        /**
         * 根据模板生成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));
    
                //解析替换文本段落对象
                ExportWordUtil.changeText(document, textMap);
    
                //解析替换表格对象
                ExportWordUtil.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++) {
                System.out.println("1111");
                XWPFTable table = tables.get(i);
                if(checkText(table.getText())){
                    System.out.println("222");
                    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 {
                                        //String ind = document.addPictureData(byteInputStream,picType);
                                        //document.createPicture(ind, width , height,paragraph);
                                        String ind = document.addPictureData(byteInputStream, picType);
                                        int id = document.getNextPicNameNumber(picType);
                                        document.createPicture(ind, id, 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);
                    /*System.out.println("333");
                    System.out.println(table.getRow(1).getHeight());*/
                    for(int k=0; k<daList.get(0).length;k++){
                        row.createCell();//根据String数组第一条数据的长度动态创建列
                    }
                    row.setHeight(400);//设置行高度
                }
    
                //创建行,根据需要插入的数据添加新行,不处理表头
                for(int i = 0; i < daList.size(); i++){
                    table.getRow(i+1).setHeight(400);//设置行高度
                    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]);
                        /** 设置水平居中 */
                        CTTc cttc = cell02.getCTTc();
                        CTTcPr ctPr = cttc.addNewTcPr();
                        ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
                    }
                }
            }else if (4 == type){
                //插入表头下面第一行的数据
                for(int i = 0; i < tableList.size(); i++){
                    XWPFTableRow row = table.createRow();
                    row.setHeight(400);//设置行高度
                    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);
                    //cell.getCTTc().setTcPr(tcPr);
                } 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;
        }
    
    }
    

    2.自定义XWPFDocument类

    package com.management.util;
    
    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 wfg 2020-08-12.
     * 自定义 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(String blipId, int id, int width, int height, XWPFParagraph paragraph) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
    
            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);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + id);
            docPr.setDescr("头像");
        }
    }
    

    3.创建测试类

    注意使用的word模板,要有一个表头和一行空数据,要不运行会报错空指针,找不到有效行,运行下面的类后,即可看到效果

    package com.management.web;
    
    import com.management.util.CustomXWPFDocument;
    import com.management.util.ExportWordUtil;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class TestWord {
        public static void main(String[] args) throws Exception {
            //需要进行文本替换的信息
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("${date}", "(2020年08月12日)");
            data.put("${name}", "测试一下");
           
            //图片,如果是多个图片,就新建多个map
           /* Map<String,Object> picture1 = new HashMap<String, Object>();
            picture1.put("width", 100);
            picture1.put("height", 150);
            picture1.put("type", "jpg");
            picture1.put("content", ExportWordUtil.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","22","22","22"});
            list01.add(new String[]{"A","22222222222","33","22","22","22","22"});
            list01.add(new String[]{"B","33333333333","44","22","22","22","22"});
            list01.add(new String[]{"B","44444444444","55","22","22","22","22"});
            list01.add(new String[]{"B","33333333333","44","22","22","22","22"});
            list01.add(new String[]{"C","44444444444","55","22","22","22","22"});
            list01.add(new String[]{"C","33333333333","44","22","22","22","22"});
            list01.add(new String[]{"C","44444444444","55","22","22","22","22"});
            list01.add(new String[]{"C","44444444444","55","22","22","22","22"});
            //第二个动态生成的数据列表
            List<String[]> list02 = new ArrayList<String[]>();
            list02.add(new String[]{"A","11111111111","22","22","22","22","22"});
            list02.add(new String[]{"d","22222222222","33","22","22","22","22"});
            list02.add(new String[]{"B","33333333333","44","22","22","22","22"});
            list02.add(new String[]{"C","44444444444","55","22","22","22","22"});
    
            mapList.add(list01);
            //mapList.add(list02);
    
            //需要动态改变表格的位置;第一个表格的位置为0,1
            int[] placeList = {0,1};
    
            CustomXWPFDocument doc = ExportWordUtil.changWord("D:/word.docx",data,mapList,placeList);
            FileOutputStream fopts = new FileOutputStream("D:/合并表格.docx");
            doc.write(fopts);
            fopts.close();
        }
    
    
    }
    
    
    展开全文
  • /** * 合并单元格用于科研采购结果审批公文 * @throws Exception */ public static void mergeCellsForPurchaseResult(String ... // 得到word对象及word中需要合并行的表格对象 Document doc = new D...
  • ## 安装 模块 pip install python-docx ## 使用 ...## 读取 Word 文件里的表格信息 try: doc = Document('A:\\ABC.docx') except Exception as e: print("读取 Word 文件失败", e) else: print("...
  • name LIKE '%原蓝%' AND p.product_name LIKE '%苏打水%' AND p.mem_type LIKE '%透明膜%' 3.word表格的文档导出功能 3.1 导出要求梳理 效果图中涉及到数据的替换,动态插入数据和图片,根据要求合并单元格。...
  • word嵌入表格,完美解决报表

    千次阅读 热门讨论 2015-12-22 15:35:07
    【背景概要】  项目中,有很多地方涉及到需要打印各种表格,静态的,动态... 在放下报表问题实现其它需求期间,偶然发现,我们可以动态的将表格嵌入到word文件中,利用word将各种表格显示打印。这里用到的就是Aspos
  • css拼接表格,达到冻结列的效果

    千次阅读 2018-09-08 15:14:11
    现在的需求就是,当被评分人数过多时,右边表格需要自动形成滚动条,可滚动评分,而此时左边评分规则不动。  当每一个评分因素评完分之后,需要自动计算该评分项的小计总分以及该被评分人的总计得分,且此处表格...
  • 如HIS 5 MSH-3-1 Namespace ID Excel操作 1、连接将非变量体字符替换 ,F列 =SUBSTITUTE(SUBSTITUTE(A2,"-","_"),"/","OR") F MSH_1 MSH_2 MSH_3 MSH_3_1 2、拼接成一个成员变量,G列 =CONCATENATE("/// /// ...
  • poi操作word模板表格遇到的一些问题

    千次阅读 2020-06-19 16:30:10
    poi操作word模板是遇到一些表格展示问题,生成word表格动态添加行时新增行样式和模板设置样式不一致 添加新的一行官网实现方式有以下几种 table.addNewRowBetween 官方没实现 table.insertNewTableRow(pos) 在pos...
  • 因项目需要,生成的word表格需要用到“黑体”字(可能就是不支持中文字体), 但怎么改代码都无效,查看源码发现是通过xml来拼接word最后转成word的, 最后在这个目录下 修改docxtable.js文件 增加这两行...
  • Word表格编辑等技巧

    千次阅读 2013-11-20 17:00:13
    将插入点定位在单元格中,单击“表格→绘制斜线表头”命令,出现对话框,单击“表头样式”下拉菜单选择一种样式(共有5种可选择),分别填入“行标 题”(右上角的项目)、“列标题”(左下角的项目)和“数据标题”...
  • 选择第一个左上角的十字形,右键单击,选择表格内容 原先的“文绕图”为“无”,这里将其设置为“文绕图”,然后点击确定 将光标放在这里: 按下delete键,表格合并到一起了,而且不会自动调整。
  • Java如何制作带表格word文档

    千次阅读 2020-08-05 17:44:10
    设置和添加表格有关操作 写在最前 首先您需要导入WordGo的jar包或者写上maven仓库的坐标,最新版直接去git下载就好:https://github.com/qrpcode/wordgo/blob/master/README_CN.md 表格计算行列时,全部和我们平时...
  • poi-java导出word表格中换行

    千次阅读 2019-02-25 18:26:44
    //替换表格的内容 /** * 替换表格中的指定文字 */ List&lt;XWPFTable&gt; tables = document.getTables(); for (XWPFTable table : tables) { List&lt;XWPFTableRow&gt; rows = table.getRows...
  • 如下所示,有两个表格,长宽都一致,如何进行合并? 解决的办法很简单:只要在中间的空行输入del键,删除当前回车即可变成以下所需求的目标。 但是有时候会出现以下情况: 表面看起来好象是一起了,但是仔细看...
  • SpringBoot+Poi-tl根据Word模板动态生成含动态表格word文档。 Poi-tl官方文档:http://deepoove.com/poi-tl/ 实现过程 1.添加必要依赖 <!-- word导出 --> <!-- poi-tl是基于Apache POI的Word模板引擎。...
  • 本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后 介绍Poi-tl导出word的延伸功能: 所需依赖以及word模板所属位置 见 SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格),这里...
  • 数据导出excel表格Word文档 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System....
  • word-wrap: break-word; } .add { margin: 0 auto; display: block; } 品牌 车型 版本 配置 颜色 数量 类型 结算价 行情价 操作 <td></td> <td></td> <td></td> <td></td...
  • Java 页面表格导出Word

    2011-06-21 10:25:39
    StringBuffer sb = new ...//拼接字符串 sp = createStringBuffer();   //导出流到前台。  InputStream is = new ByteArrayInputStream(sb.toString().getBytes()); FileExport fe = new FileExport(String.v...
  • Java 下载Word文档...文档下载(图片,数据表格),pom依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version>
  • 生成带有表格word附件和动态赋值, 表格前后需要添加一个特殊的开始和结束的域,表格第一列 TableStart:AuditJdcttbzInfo 和表格的最后一列 TableEnd:AuditJdcttbzInfo,然后再添加这个第一列和最后一列的需要...
  • def writeSuperLink(tableCount, tableHead, filePath): # 三个参数分别为该Word表格的数目,表格的头, Excel路径 workBook = xlrd.open_workbook(filePath) writeBook = copy(workBook) writeSheet = write...

空空如也

空空如也

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

word表格拼接