精华内容
下载资源
问答
  • 用phpword处理docx模板时候始终发生神奇的BUG,就是复制原版例子里的${Value1}进自己的模板然后替换是没问题的,但是只要一改动这个变量文字,PHP做相应替换就失效了。 用了下残废百度无果,一怒翻起google,准确...

    phpword处理docx模板时候始终发生神奇的BUG,就是复制原版例子里的${Value1}进自己的模板然后替换是没问题的,但是只要一改动这个变量文字,PHP做相应替换就失效了。

    用了下残废百度无果,一怒翻起google,准确度高多了。

       原来有2个PHPWord项目:

    其中适用比较广的是PHPOffice项目下的一个子项目

    Git地址:https://github.com/PHPOffice/PHPWord

    查看官方的文档:

    http://phpword.readthedocs.org/en/latest/templates-processing.html?highlight=replace

    具体如何用模板做替换:

    1. include_once ('exec/lib/phpword/src/PhpWord/PHPWord.php');  
    2. use PhpOffice\PhpWord\Autoloader;  
    3. use PhpOffice\PhpWord\Settings;  
    4. use PhpOffice\PhpWord\IOFactory;  
    5.   
    6. include_once ('exec/lib/phpword/src/PhpWord/Autoloader.php');  
    7. Autoloader::register();  
    8. Settings::loadConfig();  
    9.   
    10. // Create a new PHPWord Object  
    11. $PHPWord = new \PhpOffice\PhpWord\PhpWord();  
    12. $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('statics/template/adminPositive.docx');  
    13. $templateProcessor->setValue('xm1''姓名');  
    14. $templateProcessor->setValue('zw1''公务员');  
    15. $templateProcessor->setValue('sfz1''360281199909090009');  
    16. $templateProcessor->setValue('gz1''统发');  
    17. //$templateProcessor->setValue('Street', 'Coming-Undone-Street 32');  
    18. $templateProcessor->saveAs('test.docx');  

    这里要注意的是换行问题。


    另外copy一篇比较nice的博文做个备份

    转载自:http://wangye.org/blog/archives/943/

    ===============================================================================================

    最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用Microsoft Office自带的ActiveX/COM组件,比如Word.Application,这种方式的优点是格式兼容度高,可以生成纯doc的Word2003格式文档,缺点一是比较占资源(调用会启动一个WINWORD.EXE进程),不适合Web多用户访问使用;二是PHP这种Web开发技术大多数是跑在Linux服务器上,当然也就无法使用Windows下的技术了,平台可移植和兼容性不好。第二种生成Word的方案是生成Word兼容的网页格式,然后以Word方式打开,这种方案总体上感觉怪怪的,毕竟文件格式是HTML的,而且格式兼容度不好,不过这种方式的优点是节省服务器资源,能够快速生成;最后一种方案也就是今天的主角,采用PHPWord生成Word2007(docx)格式的文档,现在基本上微软Office Word 2003以后的版本均兼容这种格式了,对于2003版本来说,仅需要下载安装个兼容格式包(下载地址),也能正常打开这类文件,当然如果你使用的是最新版本的Office(包括但不限于Office 2007、Office 2010)则不需要安装此格式包。

    好了,下面我就介绍一下PHPWord,大家可以通过访问项目主页下载并获得关于项目的更多信息。

    我在使用过程中主要遇到了中文乱码的问题,结合网上大神们的指导,通过下面的方式解决了这类问题,希望对大家有所帮助。

    1、增加东亚字体支持

    打开并编辑路径/Writer/Word2007/Base.php文件内容,大概在第349行(行数随着版本可能会有变化)大概函数_writeTextStyle内添加:

    1. $objWriter->writeAttribute('w:eastAsia'$font)  


    比如我的修改片段基本是下面这样:

    1. // Font  
    2. if($font != 'Arial') {  
    3.     $objWriter->startElement('w:rFonts');  
    4.         $objWriter->writeAttribute('w:eastAsia'$font); // 添加这行  
    5.         $objWriter->writeAttribute('w:ascii'$font);  
    6.         $objWriter->writeAttribute('w:hAnsi'$font);  
    7.         $objWriter->writeAttribute('w:cs'$font);  
    8.     $objWriter->endElement();  
    9. }  


    2. 解决中文乱码问题

    编辑PHPWord/Template.php,找到代码$replace = utf8_encode($replace);,删除或者注释掉这行代码,添加$replace = iconv( 'gbk','utf-8', $replace);,比如代码改为如下:

    1. /** 
    2.  * Set a Template value 
    3.  *  
    4.  * @param mixed $search 
    5.  * @param mixed $replace 
    6.  */  
    7. public function setValue($search$replace) {  
    8.     if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {  
    9.         $search = '${'.$search.'}';  
    10.     }  
    11.    
    12.     if(!is_array($replace)) {  
    13.         //$replace = utf8_encode($replace);  
    14.         $replace =iconv('gbk''utf-8'$replace); // 注释掉上面行后添加这行  
    15.     }  
    16.    
    17.     $this->_documentXML = str_replace($search$replace$this->_documentXML);  
    18. }  


    调用方式如下:

    1. $document->setValue('Template', iconv('utf-8''GB2312//IGNORE''中文'));  


    上面的代码主要解决模板的问题,下面同样的道理,解决Section添加文本的问题,找到代码$givenText = utf8_encode($text);,删除或者注释掉这行代码,添加$givenText = iconv('gbk', 'utf-8', $text);,比如代码如下:

    1. /** 
    2.  * Add a Text Element 
    3.  *  
    4.  * @param string $text 
    5.  * @param mixed $styleFont 
    6.  * @param mixed $styleParagraph 
    7.  * @return PHPWord_Section_Text 
    8.  */  
    9. public function addText($text$styleFont = null, $styleParagraph = null) {  
    10.     //$givenText = utf8_encode($text);  
    11.     $givenText = iconv('gbk''utf-8'$text); // 注释掉上面行后添加这行  
    12.     $text = new PHPWord_Section_Text($givenText$styleFont$styleParagraph);  
    13.     $this->_elementCollection[] = $text;  
    14.     return $text;  
    15. }  


    调用方式和上面的模板调用大同小异,这边就不列举了。

    折腾了这么多,突然发现网上还有另外一个版本的PhpWord,项目类名大小写上略有不同,隶属于PHPOffice/PHPWordGitHub项目地址文档)。这个版本的PHPWord内容更加丰富,支持的功能也比较多(包括行间距,缩进和首行缩进等),最后我也采取的这个版本的PHPWord,值得注意的是这两个版本的PHPWord在API接口上基本一致,可以通用。但是有些API,在PHPOffice/PHPWord里是不推荐的,比如createSection需要改成addSection,另外应用这个版本的PHPWord不需要像上面那样做任何中文支持的修改,比较省事。

    这两个PHPWord项目的官方都提供了较详细的使用例子和文档,这里就不介绍了。最后提示的是:在模板模式下loadTemplate,只能使用setValue等模板操作方法,不能再添加段落或者段落修改了。这个略有不便。

    参考文档:phpword 部分BUG修改笔记及心得

    对于PHPOffice/PHPWord我提供一个简单的例子供参考(当然官方例子更多):

    1. require_once 'PhpOffice/PhpWord/PhpWord.php'// 包含头文件  
    2. use PhpOffice\PhpWord\Autoloader;  
    3. use PhpOffice\PhpWord\Settings;  
    4. use PhpOffice\PhpWord\IOFactory;  
    5.    
    6. require_once __DIR__ . '/PhpOffice/PhpWord/Autoloader.php';  
    7. Autoloader::register();  
    8. Settings::loadConfig();  
    9.    
    10. // Create a new PHPWord Object  
    11. $PHPWord = new \PhpOffice\PhpWord\PhpWord();  
    12. $PHPWordHelpernew \PhpOffice\PhpWord\Shared\Font();  
    13.    
    14. $PHPWord->setDefaultFontName('仿宋'); // 全局字体  
    15. $PHPWord->setDefaultFontSize(16);     // 全局字号为3号  
    16.    
    17. // 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤  
    18. $properties = $PHPWord->getDocumentProperties();  
    19. $properties->setCreator('张三');   // 创建者  
    20. $properties->setCompany('某公司'); // 公司  
    21. $properties->setTitle('某某文档'); // 标题  
    22. $properties->setDescription('http://wangye.org'); // 描述  
    23. $properties->setLastModifiedBy('李四'); // 最后修改  
    24. $properties->setCreated( time() );      // 创建时间  
    25. $properties->setModified( time() );     // 修改时间  
    26.    
    27. // 添加3号仿宋字体到'FangSong16pt'留着下面使用  
    28. $PHPWord->addFontStyle('FangSong16pt'array('name'=>'仿宋''size'=>16));  
    29.    
    30. // 添加段落样式到'Normal'以备下面使用  
    31. $PHPWord->addParagraphStyle(  
    32.   'Normal',array(  
    33.     'align'=>'both',  
    34.     'spaceBefore' => 0,  
    35.     'spaceAfter' => 0,  
    36.     'spacing'=>$PHPWordHelper->pointSizeToTwips(2.8),  
    37.     'lineHeight' => 1.19,  // 行间距  
    38.     'indentation' => array// 首行缩进  
    39.       'firstLine' => $PHPWordHelper->pointSizeToTwips(32)  
    40.     )  
    41.   )  
    42. );  
    43.    
    44. // Section样式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,页脚3厘米  
    45. // 注意这里厘米(centimeter)要转换为twips单位  
    46. $sectionStyle = array(  
    47.     'orientation' => null,  
    48.     'marginLeft' => $PHPWordHelper->centimeterSizeToTwips(3),  
    49.     'marginRight' => $PHPWordHelper->centimeterSizeToTwips(3),  
    50.     'marginTop' => $PHPWordHelper->centimeterSizeToTwips(3.5),  
    51.     'marginBottom' => $PHPWordHelper->centimeterSizeToTwips(3.8),  
    52.     'pageNumberingStart' => 1, // 页码从1开始  
    53.     'footerHeight' => $PHPWordHelper->centimeterSizeToTwips(3),  
    54. );  
    55.    
    56. $section = $PHPWord->addSection($sectionStyle); // 添加一节  
    57.    
    58. // 下面这句是输入文档内容,注意这里用到了刚才我们添加的  
    59. // 字体样式FangSong16pt和段落样式Normal  
    60. $section->addText('文档内容''FangSong16pt''Normal');  
    61. $section->addTextBreak(1); // 新起一个空白段落  
    62.    
    63. $objWriter = IOFactory::createWriter($PHPWord'Word2007');  
    64. $objWriter->save('/path/to/file'); // 保存到/path/to/file路径下  

    展开全文
  • WORD文件的每一页替换成一个文档,适用于每页之间不存在关联、可以独立成文的文档。例如调查表,文档的每一页有一个表格,拆分后每一个文档都拥有完整独立的内容。 按一级标题拆分 将当前文档按一级标题拆分成多个...
  • Java 添加、替换、删除Word中的图片 文档中,可以通过图文混排的方式来增加内容的可读性,相比纯文本文档,在内容展现方式上也更具美观性。在给文档添加图片时,可设置图片的文本环绕方式、旋转角度、图片高度/宽度...

    Java 添加、替换、删除Word中的图片

    文档中,可以通过图文混排的方式来增加内容的可读性,相比纯文本文档,在内容展现方式上也更具美观性。在给文档添加图片时,可设置图片的文本环绕方式、旋转角度、图片高度/宽度等;另外,也可对文档中已有的图片实现替换、删除等操作。本文将从在Word文档中添加、替换、删除图片等三个操作需求来介绍。具体代码可参考以下示例。
    工具使用:Free Spire.Doc for Java(免费版)
    【示例1】添加图片到Word
    import com.spire.doc.*;
    import com.spire.doc.documents.Paragraph;
    import com.spire.doc.documents.TextWrappingStyle;
    import com.spire.doc.fields.DocPicture;

    public class AddPicture {
    public static void main(String[] args) {
    //加载文档
    Document doc = new Document();
    doc.loadFromFile(“test.docx”);

        //获取第二段  
        Paragraph para = doc.getSections().get(0).getParagraphs().get(1);  
    
        //添加图片,并设置图片高、宽、旋转角度、文本环绕方式  
        DocPicture picture = para.appendPicture("tp.png");  
        picture.setHeight(150);  
        picture.setWidth(200);  
        picture.setRotationEx(30);  
        picture.setTextWrappingStyle(TextWrappingStyle.Inline);  
    
        //保存文档  
        doc.saveToFile("AddPicture.docx",FileFormat.Docx_2013);  
        doc.dispose();  
    }  
    

    }
    【示例2】替换Word中的图片
    import com.spire.doc.*;
    import com.spire.doc.documents.Paragraph;
    import com.spire.doc.fields.DocPicture;

    public class ReplacePicture {
    public static void main(String[] args) {
    //加载Word文档
    Document doc = new Document();
    doc.loadFromFile(“sample.docx”);

        //获取文档中的指定段落  
        Section section = doc.getSections().get(0);  
        Paragraph para = section.getParagraphs().get(0);  
        //替换段落中的第一张图片  
        Object obj = para.getChildObjects().get(0);  
        if(obj instanceof DocPicture){  
            DocPicture pic = (DocPicture)obj;  
            pic.loadImage("tp.png");  
        }  
    
        /*批量替换图片 
        for(int i =0;i < section.getParagraphs().getCount();i++){ 
            Object obj = section.getParagraphs().get(i).getChildObjects(); 
            if(obj instanceof DocPicture){ 
                DocPicture pic = (DocPicture)obj; 
                pic.loadImage("tp.png"); 
            } 
        }*/  
    
        //保存结果文档  
        doc.saveToFile("ReplaceWithImage.docx", FileFormat.Docx_2013);  
        doc.dispose();  
    }  
    

    }
    【示例3】删除Word中的图片
    import com.spire.doc.*;
    import com.spire.doc.documents.Paragraph;
    import com.spire.doc.fields.DocPicture;

    public class DeletePicture {
    public static void main(String[] args) {
    //加载测试文档
    Document doc = new Document();
    doc.loadFromFile(“sample.docx”);

        //获取段落  
        Section sec = doc.getSections().get(0);  
        Paragraph para = sec.getParagraphs().get(0);  
    
        //获取段落中的图片对象,删除  
        DocPicture picture = (DocPicture) para.get(0);  
        para.getChildObjects().remove(picture);  
    
        /*//批量删除所有图片 
        for (int i = 0 ; i < sec.getParagraphs().getCount(); i++){ 
            Paragraph para = sec.getParagraphs().get(i); 
            for (int j = 0; j< para.getChildObjects().getCount();j++) { 
                Object obj = para.getChildObjects().get(j); 
                if(obj instanceof DocPicture){ 
                    DocPicture pic = (DocPicture)obj; 
                    para.getChildObjects().remove(pic); 
                } 
            } 
        }*/  
    
        //保存结果文档  
        doc.saveToFile("DeletePictures.docx", FileFormat.Docx_2013);  
        doc.dispose();  
    }  
    

    }
    喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资料的也可以私信我!
    祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发!在这里插入图片描述

    展开全文
  • Java分布式中文分词组件 - word分词 word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名...
  • word中加入excel附件 excel单元格中插入图片 ...替换替换 文字 和附件base64内容 有两个binaryData标签 一个是base64,另一个是附件显示的样式 /** * word附件导出 */ @ResponseBody @Req

    word中加入excel附件
    excel单元格中插入图片
    word freemarker
    Excel poi 制作, jxl 插入图片

    压缩图片/宽高,动态控制单元格高度与宽度
    在这里插入图片描述

    1.word 需要模板
    手动创建word excel .向word中插入excel附件并另存为 word xml 格式
    在这里插入图片描述

    在这里插入图片描述
    替换符替换 文字 和附件base64内容
    有两个binaryData标签 一个是base64,另一个是附件显示的样式
    在这里插入图片描述

    在这里插入图片描述

    
      /**
         * word附件导出
         */
        @ResponseBody
        @RequestMapping(value = "/generateReports", method = RequestMethod.GET)
        public void generateReports(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //查询数据
            Map condition = getSelection(request);
       
            //生成excel
            Long num = System.currentTimeMillis();
            String filename = num + ".xls";
            sendExcel(request, response, filename);
            //制作word
            WordUtil wordUtil = new WordUtil();
            Map<String, Object> dataMap = new HashMap<String, Object>();
            /**wordTemplate*/
            Department dept = (Department) request.getSession().getAttribute("CURRENT_DEPT");
    //        List<Map> mapList = sortingService.findShopInfoBySort2(condition);
           // if (mapList.size() > 0) {
                //向word中添加数据map
                Date startTime = DateUtil.parseTime(start);
                Date endTime = DateUtil.parseTime(end);
                String startTime1 = new SimpleDateFormat("yyyy年MM月dd日").format(startTime);
                String endTime1 = new SimpleDateFormat("yyyy年MM月dd日").format(endTime);
                dataMap.put("startTime", startTime1);
                dataMap.put("endTime", endTime1);
          //  }
            //调试
    //        Thread.sleep(1000);
    //        dataMap.put("excelEnclosure", wordUtil.getFileStr(filePath + "副本" + filename));
    
            //写入
            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/msword");
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("函告" + num + ".doc", "UTF-8"));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            wordUtil.createDoc(dataMap, response, "wordTemplate", filePath + "函告" + num + ".doc");
    
            //删除临时文件
            File file = new File(filePath + "副本" + filename);
            if (file.exists()) {
                file.delete();
            }
        }
    
    public class WordUtil {
    	public Configuration configure=null;
    	public WordUtil(){
    //       configure=new Configuration(Configuration.VERSION_2_3_22);
    		configure=new Configuration();
    		configure.setDefaultEncoding("utf-8");
    	}
    //创建word
    	public void createDoc( Map<String,Object> dataMap,HttpServletResponse response, String downloadType, String savePath){
    
    		try {
    			//加载需要装填的模板
    			Template template=null;
    			//设置模板装置方法和路径,FreeMarker支持多种模板装载方法。可以从servlet,classpath,数据库装载。
    			//加载模板文件,放在template下
    			configure.setClassForTemplateLoading(this.getClass(), "/com/~/util/template");
    			//设置对象包装器
    			//configure.setObjectWrapper(new DefaultObjectWrapper());
    			//设置异常处理器
    			configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
    			//定义Template对象,注意模板类型名字与downloadType要一致
    			template=configure.getTemplate(downloadType + ".xml");
    			File outFile=new File(savePath);
    			Writer out=null;
    			//指定编码表需使用转换流,转换流对象要接收一个字节输出流
    			out = response.getWriter();
    			template.process(dataMap, out);
    
    			out.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (TemplateException e) {
    			e.printStackTrace();
    		}
    	}
    	}
    
     /**
         * 制作excel
         */
        public void sendExcel(HttpServletRequest request, HttpServletResponse response, String filename) {
        	//condition 筛选条件
            Map condition = getSelection(request);
            //获取数据
            List<TShopCheckInfo> list = this.tShopCheckInfoService.selectShopInfoList(condition);
            //列头
            String[] title = {  "是否", "图片",};
            String sheetName = "sheet1";
            String[][] content = new String[list.size()][2];
            try {
                int nu = 50;
                if (list.size() < nu) {
                    nu = list.size();
                }
                //循环添加数据   数据库存的图片地址
                for (int i = 0; i < list.size(); i++) {
                    content[i][0] = list.get(i).getEscape() ? (StringUtils.isNotEmpty(list.get(i).getEscapeText()) ? "是(" + list.get(i).getEscapeText() + ")" : "是") : "否";
                    content[i][1] = list.get(i).getEscapeImgs();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
            try {
                // TODO: 2020/7/29  地址需要更换
                //输出Excel文件
                // 这里是先将文件输出到服务器本地,再用WritableWorkbook进行图片处理
                FileOutputStream output = new FileOutputStream(filePath + filename);
                wb.write(output);
                output.flush();
                //测试
                Thread.sleep(1000);
                //插入图片到excel
                List<String> nameList = new ArrayList<>();
                excelImgUpdate(filePath, filename, list, nameList);
                //响应到客户端
    //            FileInputStream inputStream = new FileInputStream(filePath + "副本" + filename);
    //            org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(inputStream);
                //setHeader
    //            downLoadExcel("附件" + filename, response, workbook);
    //            FileOutputStream output = new FileOutputStream(filePath + filename);
                //删除临时文件
    //            nameList.add(filePath + "副本" + filename);
                nameList.add(filePath + filename);
                delTemporary(nameList);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    package com.ztwx.ezxf.util;
    import org.apache.commons.lang.StringUtils;
    import org.apache.poi.hssf.usermodel.*;
    public class ExcelUtil {
    
    	/**
    	 * 导出Excel
    	 */
    	public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
    		// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
    		if (wb == null)
    			wb = new HSSFWorkbook();
    		// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
    		HSSFSheet sheet = wb.createSheet(sheetName);
    		//设置单元格的宽度
    		sheet.setDefaultColumnWidth(18);
    		//设置第一列宽度
    		sheet.setColumnWidth(0, 252*40+323);
    		//设置第四列宽度
    		sheet.setColumnWidth(3, 252*25+323);
    		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
    		HSSFRow row = sheet.createRow(0);
    		// 第四步,创建单元格,并设置值表头 设置表头居中
    		HSSFCellStyle style = wb.createCellStyle();
    		style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
    		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
    		style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    		style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
    		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    		
    		//声明列对象
    		HSSFCell cell = null;
    		HSSFCell cell2 = null;
    		HSSFFont font = wb.createFont();
    
    		//创建标题
    		for (int i = 0; i < title.length; i++) {
    			cell = row.createCell(i);
    			cell.setCellValue(title[i]);
    			//字体
    //			font.setBoldweight(Font.BOLDWEIGHT_BOLD);
    			font.setFontHeightInPoints((short) 12);
    			style.setFont(font);
    			cell.setCellStyle(style);
    		}
    		//创建内容
    		for (int i = 0; i < values.length; i++) {
    			row = sheet.createRow(i + 1);
    			//清空字体
    //			font.setBoldweight((short)400);
    //			font.setBold(false);
    //			style.setFont(font);
    			for (int j = 0; j < values[i].length; j++) {
    				
    				//将内容按顺序赋给对应的列对象
    				cell2 = row.createCell(j);
    				if(StringUtils.isNotBlank(values[i][j])){
    					cell2.setCellValue(values[i][j]);
    				}else{
    					cell2.setCellValue("/");
    				}
    
    //				内容设置样式
    				cell2.setCellStyle(style);
    			}
    		}
    		return wb;
    	}
    }
    
    
     //向excel 加入图片
        public List<String> excelImgUpdate(String filePath, String filename, List<TShopCheckInfo> list, List<String> nameList) throws Exception {
            Workbook wb = Workbook.getWorkbook(new File(filePath + filename)); // 获得原始文档
            //创建副本;
            WritableWorkbook workbook = Workbook.createWorkbook(new File(filePath + "副本" + filename), wb);
            WritableSheet sheet = workbook.getSheet(0);
            //调用图片插入函数  图片插入的行列
            //用map存放有图片时候对应的行信息  列固定
    //        Map<Integer, ArrayList> map = new HashMap();
          
            for (int i = 0; i < list.size(); i++) {
                //8   插入对应的列
                String json9 = list.get(i).getEscapeImgs();
                ArrayList arrayList9 = getImgSrc(json9);
                if (arrayList9.size() > 0) {
                    nameList = imgExcelService.addPictureToExcel(nameList, sheet, arrayList9, i + 1, 8);
                }
            }
    
            //写入Excel表格中;
            workbook.write();
            //关闭流;
            workbook.close();
            return nameList;
        }
    
    //图片压缩与写入  单元格控制
    public List<String> addPictureToExcel(List<String> nameList,WritableSheet picSheet, ArrayList pictureFilePaths, double cellRow, double cellCol)
                throws Exception {
            final double cellSpace = 0.02;//图片之间的间隔 占比
            double picWidthMax = 0;
            double picHeightSum = 0;//空出图片 离上下边框的距离
            ImgFile[] imgFiles = new ImgFile[pictureFilePaths.size()];
            //存放临时文件名
            for (int i = 0; i < pictureFilePaths.size(); i++) {
                ImgFile imgFile = new ImgFile();
                //下载图片到本地
                Long da = System.currentTimeMillis();
    //            String filePath = AddressUtil.getMacOrWin();
                String path = filePath + da + ".jpg";
                nameList.add(path);
                downloadPicture(pictureFilePaths.get(i).toString(), path);
                //图片压缩
    //            Thumbnails.of(path).size(300,300).toFile(path);
                CompressImageUtil.reduceImg(path,path,0,0,0.5f);
                File imageFile = new File(path);
    
                // 读入图片
                BufferedImage picImage = ImageIO.read(imageFile);
                ByteArrayOutputStream pngByteArray = new ByteArrayOutputStream();
                //将其他图片格式写成png的形式
                ImageIO.write(picImage, "PNG", pngByteArray);
                imgFile.setPngByteArray(pngByteArray);
                // 取得图片的像素高度,宽度
                //这里设置图片在单元格的尺寸 原理不清楚  该值为具体实验值
                double picWidth = picImage.getWidth() * 0.06;
    //            double picWidth = picImage.getWidth() ;
                double picHeight = picImage.getHeight() * 7;
    //            double picHeight = picImage.getHeight() ;
                imgFile.setHeigth(picHeight);
                imgFile.setWidth(picWidth);
                //汇总
                if (picWidth > picWidthMax) {
                    picWidthMax = picWidth;
                }
                picHeightSum += picHeight;
                imgFiles[i] = imgFile;
            }
    
            WritableFont font = new WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
            WritableCellFormat cellFormat = new WritableCellFormat(font);
            //设置背景颜色;
            cellFormat.setBackground(Colour.WHITE);
            //设置边框;
            cellFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
            //设置自动换行;
            cellFormat.setWrap(true);
            //设置文字居中对齐方式;
            cellFormat.setAlignment(Alignment.CENTRE);
            //设置垂直居中;
            cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
    
            Label imageLabel = new Label((int) cellCol, (int) cellRow, "", cellFormat);
            picSheet.addCell(imageLabel);
    
            //获取图片需要插入的单元格
    //        WritableCell cell =picSheet.getWritableCell(0, 0);
    
            //设置单元格宽高
            picSheet.setColumnView((int) cellCol, (int) picWidthMax);//列宽
            picSheet.setRowView((int) cellRow, (int) picHeightSum);//行高
    
            double widthStart = cellSpace;//开始宽度
            double heightStart = cellSpace;//开始高度
            //插入图片
            for (ImgFile imgFile0 : imgFiles) {
                double heigthFact = imgFile0.getHeigth() / picHeightSum;//实际高度
                double widthFact = imgFile0.getWidth() / picWidthMax;
                //图片高度压缩了cellSpace+moreHeight,目的是为了该图片高度不超出单元格
                if (heightStart + heigthFact >= 1) {
                    double moreHeight = heightStart + heigthFact - 1.00;
                    heigthFact -= moreHeight;
                    heigthFact -= cellSpace;
                }
                //图片宽度压缩了cellSpace,目的是为了该图片宽度不超出单元格
                if (widthFact >= 1) {
                    widthFact -= cellSpace;
                }
                //生成图片对象
                WritableImage image = new WritableImage(cellCol + widthStart, cellRow + heightStart,
                        widthFact, heigthFact, imgFile0.getPngByteArray().toByteArray());
                //将图片对象插入到sheet
                picSheet.addImage(image);
                //开始高度累加,获取下一张图片的起始高度(相对该单元格)
                heightStart += heigthFact;
                heightStart += cellSpace;//图片直接间隔为cellSpace
            }
            return nameList;
        }
    
    
        private static void downloadPicture(String urlList, String path) {
            URL url = null;
            try {
                url = new URL(urlList);
                DataInputStream dataInputStream = new DataInputStream(url.openStream());
    
                FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
                ByteArrayOutputStream output = new ByteArrayOutputStream();
    
                byte[] buffer = new byte[1024];
                int length;
    
                while ((length = dataInputStream.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }
                BASE64Encoder encoder = new BASE64Encoder();
                String encode = encoder.encode(buffer);//返回Base64编码过的字节数组字符串
                System.out.println(encode);
                fileOutputStream.write(output.toByteArray());
                dataInputStream.close();
                fileOutputStream.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    
    展开全文
  • Word精灵插件:Word增强辅助软件,可以把各种复杂的功能简化成插件的方式显示在状态栏上,比如批注、表格、替换、拆分、数学工具、提取字符、批量命名等工具。工作中使用可以极大的减轻工作量方便快捷。 Word精灵...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    99、Word中查找/替换通配符和代码 101 四十三、Word中公式编辑器的使用技巧 104 1、公式编辑器的启动与退出 104 四十四、Word文档设置多个不同的页眉页脚 107 四十五、Word 快捷键 108 四十六、Word 通配符 110 四十...
  • Qt:如何生成word报表

    千次阅读 2019-01-22 16:56:39
    除去必要的代码,生成word报表还需要开发人员自己创建一个word模板,关于模板的样式,根据工程需要而定,只需要将文本需要替换的地方插入书签即可,关于word模板的设置后面会进行陈述。 UI界面展示 说明: 前...

    在工作学习中,有时会需要将采集的数据生成word报表的形式,如设备可靠性检测报告,检定报告等。

    本文将主要陈述如何利用Qt生成word报表。

    除去必要的代码,生成word报表还需要开发人员自己创建一个word模板,关于模板的样式,根据工程需要而定,只需要将文本需要替换的地方插入书签即可,关于word模板的设置后面会进行陈述。


    • UI界面展示

    说明:

    1. 前界面的①实验设备②检测温度③鉴定依据均需要后期人员输入
    2. 右侧表格中的数值,是程序预设好的,模拟实际的数据采集(使用QTableWidget创建)

       

    • 程序说明

    TableWidget部分(右侧表格创建过程)

    void Widget::table()
    {
        tablenet = new QTableWidget(this);//指定父对象
        tablenet->move(400,20);//设置表格在前UI中的位置
        tablenet->setRowCount(5);//行数
        tablenet->setColumnCount(7);//列数
        tablenet->resize(740,200);//表格的尺寸
        QStringList horheader;//设置表头
        horheader<<"序号"<<"测量数据1"<<"测量数据2"<<"测量数据3"<<"测量数据4"<<"测量数据5"<<"测量数据6";
        tablenet->setHorizontalHeaderLabels(horheader);//设置表头(横)
        tablenet->horizontalHeader()->setFixedHeight(30); //设置表头的高度为25
        tablenet->verticalHeader()->hide();
        for(int row=0;row<5;row++)//序号
        {
            tablenet->setItem( row,0,new QTableWidgetItem( number[row] ));
        }
        //随便插入一些数据
        for(int i=0;i<5;i++)
        {
            for(int j=1;j<7;j++)
            {
               tablenet->setItem(i,j,new QTableWidgetItem(data[i][j-1]));
               //qDebug()<<exsheet[i][j];
            }
    
        }
        //tablenet->setItem(3,3,new QTableWidgetItem(3));
        tablenet->show();
    
    }

    生成WORD报表

    void Widget::on_pushButton_clicked()
    {
        //QString path =QFileDialog::getOpenFileName(this,"打开","../","word(*doc)");
        QString path="C://Users//Administrator//Desktop//QT TEXT//words//new测试.doc";//路径从\改成//,此处为论文模板所在路径
        if(path.isEmpty()==false)
        {
               QFile file(path);
               QAxObject *words= new QAxObject(this);//定义一个指针
               words->setControl("word.Application");//指向com文件类型setControl
               words->setProperty("Visible",false);//设置是否提示或者显示对话框setProperty
               QAxObject *workbooks = words->querySubObject("Documents");//获取工作簿(excel文件)集合querySubObject
               workbooks->dynamicCall("Add(QString)", path);//链接到具体的文件dynamicCall
               //path至关重要,获取excel文件的路径
               //打开一个word文件,获取文档
               QAxObject *workbook = words->querySubObject("ActiveDocument");//获取word中已经有数值的区域querySubObject
               /********修改一个位置的内容*********/
    
               QString sLabel="设备";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
               QAxObject *pBookmark = workbook->querySubObject("Bookmarks(QString)",sLabel);//找到活跃区域内的书签querySubObject
               //就是把书签内容直接给你替换了
               QString sText=ui->device->toPlainText();//此处为替换内容
               pBookmark->dynamicCall("Select(void)");//选中要选中的区域
               pBookmark->querySubObject("Range")->setProperty("Text",sText);//进行替换操作
    
               /********修改一个位置的内容*********/
               QString tLabel="温度";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
               qDebug()<<"";
               QAxObject *tBookmarks = workbook->querySubObject("Bookmarks(QString)",tLabel);//找到活跃区域内的书签querySubObject
               qDebug()<<"";
               //就是把书签内容直接给你替换了
               QString tText=ui->temp->toPlainText();//此处为替换内容
               tBookmarks->dynamicCall("Select(void)");//选中要选中的区域
               tBookmarks->querySubObject("Range")->setProperty("Text",tText);//进行替换操作
    \
               /********修改一个位置的内容*********/
               QString mLabelt="方法";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
               QAxObject *mBookmarks = workbook->querySubObject("Bookmarks(QString)",mLabelt);//找到活跃区域内的书签querySubObject
               //就是把书签内容直接给你替换了
               QString mText=ui->method->toPlainText();//此处为替换内容
               mBookmarks->dynamicCall("Select(void)");//选中要选中的区域
               mBookmarks->querySubObject("Range")->setProperty("Text",mText);//进行替换操作*/
               qDebug()<<"方法";
               //半自动方式修改word中的表格
               QString sheetfrist = "数据";
               for(int i=1;i<6;i++)
               {
                   for(int j=1;j<7;j++)
                   {
                       QString addrow=QString("%1").arg(i);
                       QString addcolum=QString("%1").arg(j);
                       //整包
                       QString sheetlabel = QString("%1%2%3").arg(sheetfrist).arg(addrow).arg(addcolum);
    
                       //qDebug()<<sheetlabel;
                       QAxObject *sheetdata = workbook->querySubObject("Bookmarks(QString)",sheetlabel);
                       QString sheettext=tablenet->item(i-1,j)->text();//此处为替换内容,必须要加入.text().这样返回值才会正确
                       sheetdata->dynamicCall("Select(void)");//选中要选中的区域
                       sheetdata->querySubObject("Range")->setProperty("Text",sheettext);//进行替换操作
                   }
               }
    
               QString sheethead = "序号";
                   for(int j=1;j<6;j++)
                   {
                       QString addrowhead=QString("%1").arg(j);
    
                       QString sheetheadnumber = QString("%1%2").arg(sheethead).arg(addrowhead);
    
                       QAxObject *sheethead = workbook->querySubObject("Bookmarks(QString)",sheetheadnumber);
                       QString sheettexthead=tablenet->item(j-1,0)->text();//此处为替换内容
                       sheethead->dynamicCall("Select(void)");
                       //选中要选中的区域
                       sheethead->querySubObject("Range")->setProperty("Text",sheettexthead);//进行替换操作
                   }
    
              //表头等内容都是设置好的,直接替换就完事儿了
    
    
               /*****保存*******/
               QString pathsave = QFileDialog::getSaveFileName(this,"Save","../","word(*doc)");
               if(pathsave.isEmpty()==true)
               {
                   return;
               }
               workbook->dynamicCall("SaveAs(const QString&))",QDir::toNativeSeparators(pathsave));
    
               //words->setProperty("DisplayAlerts", true);//含有保存的功能,但是无法获得保存的路径,不容易进行下一步操作
    
               workbook->dynamicCall("Close(bool)", true);
               words->dynamicCall("Quit()");
               delete workbook;
               delete words;
               file.close();
               /*if(QMessageBox::question(this,"完成","文件已经导出,是否需要打开",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
               {
                   QDesktopServices::openUrl(QUrl("file:///"+QDir::toNativeSeparators(pathsave)));
                   //qDebug()<<"123";
               }*/
               QMessageBox::warning(this,"完成","文件已经保存",QMessageBox::Yes);
    
    
    
            }

    • WORD部分准备

    要完成生成word报表的程序,最重要的一步就是你需要一个提前设置好的word模板。

    以下是模板的整体预览

    其中有几个部分需要注意:

    1. 书签的设置

    在内容需要的部分,插入书签,拿本模板为样例:

    仪器名称://这个是需要人员输入的,其内容是不固定的,需要后期输入,所以在“仪器名称”后面的横线上添加书签

    选择任意文本进行输入,本文选择的是【设备】,之后选中文本

    插入——书签

     

    即可。


    • 效果展示

    界面设置如图(示例)

    点击生成

     

    选择保存路径

     打开文件 

    替换完成。


    • 总结

    关于word表格的绘制,是开发人员在word模板中提前绘制好的。

    表格的绘制也可以通过Qt的代码实现,此部分仍有待学习。

    展开全文
  • 罗刚君Word精灵 v3.0.rar

    2019-07-13 05:22:16
    多文档批量替换:对多个WORD文档执行替换,包含正文、页眉和页脚。同时还支持多个关键字替换,例如将1替换成A,将2替换成B,将3替换成C...... 拆分文档:将WORD文件的每一页替换成一个文档,适用于每页之间不存在...
  • 这两天用python批量修改word文档,熟练了字符串匹配查找和替换,下面提供以下成果: python代码和word文档放在一个路径下 用循环实现代替人工重复做重复的事,除了实现自动生成10个名字递增的文件,还要匹配到文档...
  • word源码java recommend smart_search_box是java领域的一站式搜索引擎解决方案,用户只需要进行简单的配置就可以在项目中引入完整的全文搜索能力,包括数据入库自动索引,搜索词联想,热词提示,高亮等功能。同时...
  • 我们尚未完全验证整个项目的实用性,但从技术上讲,我们设法将一个句子改写成一个较长的句子(比较罗word的句子)。 要完成此任务,需要执行几个步骤。 首先,我们需要找到一本字典,这里使用的是 ,更具体地说是...
  • 4.5 利用查找和替换迅速完成版面整理 183 Chapter5 学霸之路:长文档编辑技巧 194 5.1 论文(长文档)排版准备篇 195 5.2 排版页面构造及其设置 196 5.3 论文结构及整体规划 199 5.4 段落样式与多级列表 204 ...
  • excle 正弦表 精度直接修改即可 过程中的值可以直接修改 找了好多软件不好用,自己研究excle的,复制出对应的东西,粘贴到记事本,再转贴到word,用替换功能换位空格或者逗号导入程序即可
  • Python中的word包,正则表达式实现高度 直接先把关键短语按置信清洗好,对所有的短语,按照行顺序依次进行匹配 js中正则表达式同时实现多个关键字高亮,将其变成一个html文件,进行高亮展示 ...
  • quick_cdiscount 针对Cdiscount数据科学竞赛的快速50%精度深度学习模型,网址为 ... 要解决此问题,请将Gensim的word2vec.py第914行替换word = b''.join(word) 基于此脚本,您可以根据需要将单词向量用
  • 1、Ctrl+H,打开“替换对话框; 2、在“查找内容”里面粘贴该串 ??:??(勾选使用通配符) 3、“替换为”里面什么都不要输入(即替换为空串); 4、点击“全部替换”。 注解:通配符 ?代表一个字符,所以就算...
  • win7设置视力保护色

    2016-05-05 10:28:38
     桌面右键-》个性化-》窗口颜色-》高级外观设置-》项目:窗口-》颜色:其他-》设置 :色调85,饱和123 ,亮度205. 该方法仅能改变word,txt文档颜色。 2. 步骤2 替换 C:\Windows\Resources\Themes\Aero\Shell\...
  • 熬了N天,终于把WORD 文档打开替换、插入图片完好,部署,本机测试没有问题 可是一放到服务器(Centos 7) 就提示下面的错误: 娘一下: https://www.cnblogs.com/xiaoyu369/p/9819608.html yum install ...
  • freemarker典型场景

    2021-02-19 15:02:15
    将原始的, 用户给过来的 origin.docx 另存为 xml格式 生成origin.xml ...定位到要替换的变量 将origin.xml 改名为 origin.ftl Over 模板制作完毕,代码里用就可以了 ...将处理word格式这个无底洞给了用户, 而且.
  • 正则表达式

    2017-03-04 15:37:00
    正则表达式,是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单说,正则表达式就是用在字符串处理上面的一项“表达式”,是一种字符串处理的标准依据。  正则表达式依据表达方式的严谨...
  • 利用MacType热替换宋体和新宋体时效果很好,在Word中不会导致文档的行间距发生变化。 可将Fira Code、Source Code Pro等宽英文字体FontLink到本字体,保证2:1的宽度比,如果直接FontLink到微软雅黑则部分字号下无法...
  • 对比两个图的相似度

    2020-05-25 22:18:16
    方法一:weisfeiler-lehman算法:粗略来说就是,首先拿出要对比的两个图,利用哈希,给每个节点一个hash值,之后将节点的原始值替换为哈希之后的值,利用jaccard计算两个图的相似度,为了提高准确,可以进行多次...
  • AlkkCMS 免费版 V1.0.rar

    2019-07-05 01:46:10
    ▪ 自动上传本地图片和word图片(word图片需使用从word粘贴功能) ▪ Digg功能,加强网友参与 ▪ 会员功能,会员注册经审核后生效,会员可以推荐新闻 ▪ 会员属于会员组,可设置指定会员组有权阅读新闻 ▪ 会员...
  • eWebEditor Version 8.3.0 商业版

    热门讨论 2012-09-01 21:40:56
    修正当使用原名上传,同名处理模式为替换时的错误。 修正后台的上传管理,删除文件链接返回的问题。 .NET版,修正当网页存在未命名对象可能的错误。 PHP版,修正远程上传时,当有多个图片,部分图片不能上传的...
  • ·自动上传本地图片和word图片(word图片需使用从word粘贴功能) ·可对网页与关键静态文件进行Gzip压缩,减少服务器流量并加快网页打开速度 ·提供工具转换网站为utf-8编码,以实现多语言显示 ·Digg功能,加强...
  • 英语考试资料

    2013-08-27 17:05:06
    本文由【中文word文档库】www.wordwendang.com 搜集整理... |----常见职业英语词汇(DOC 13) |----INTERVIEW WITH THE VAMPIRE(doc 117)英文 |----... |----NEW CONCEPT ENGLISH BOOK 2(doc 212) |----五小时四级...
  • ·自动上传本地图片和word图片(word图片需使用从word粘贴功能) ·可对网页与关键静态文件进行Gzip压缩,减少服务器流量并加快网页打开速度 ·提供工具转换网站为utf-8编码,以实现多语言显示 ·Digg功能,加强...
  • ·自动上传本地图片和word图片(word图片需使用从word粘贴功能) ·可对网页与关键静态文件进行Gzip压缩,减少服务器流量并加快网页打开速度 ·提供工具转换网站为utf-8编码,以实现多语言显示 ·Digg功能,加强...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 147
精华内容 58
关键字:

word替换度