精华内容
下载资源
问答
  • python实现word文档内容替换

    千次阅读 2020-07-09 23:51:31
    利用win32com模块对.doc文档转为docx from win32com import client as wc import os import docx import sys def help(): print("Format: python py_file path+filename.doc/.docx A/B/C a/b/c\n" "eg: ...

    直接上代码:

    利用docx读取.docx格式

    利用win32com模块对.doc文档转为docx

     

    脚本调用: python your.py your.doc/your.docx 被替换字符A/被替换字符B/被替换字符C 替换字符a/替换字符b/替换字符c

    from win32com import client as wc
    import os
    import docx
    import sys
    
    def help():
        print("Format: python py_file path+filename.doc/.docx A/B/C a/b/c\n"
              "eg: python preplace_string.py E:/....../a.docx 你好/好的/谢谢 你好啊/嗯嗯/不客气\n"
              "eg: python preplace_string.py E:/....../a.doc 你好/好的/谢谢 你好啊/嗯嗯/不客气\n"
    		  "EXE:\n"
    		  "eg: preplace_string.exe E:/....../a.doc 你好/好的/谢谢 你好啊/嗯嗯/不客气\n"
    		  "eg: preplace_string.exe E:/....../a.docx 你好/好的/谢谢 你好啊/嗯嗯/不客气\n"
              "替换字符串与被替换字符串一一对应,不同字符串用/分割\n")
    if __name__=='__main__':
        #print(sys.argv)
        num=len(sys.argv)
    
        if(num!=4):
            help()
            sys.exit(1)
    
        path=sys.argv[1]#file
        if not os.path.exists(path):
            print(path,'does not exist!!!!!\n')
        path=os.path.abspath(path)
        basename,ext=os.path.splitext(path)
        if ext=='.doc':
            try:
                #webbrowser.open(path)
                word = wc.Dispatch("Word.Application")
                doc = word.Documents.Open(path)
                doc.SaveAs(basename+'.docx', 12)# 12为docx
                doc.Close()
                word.Quit()
            except:
                print("can not read "+path+"!\nPlease check out that whether the format of the file is doc/docx Or Does this file exist!!!")
                sys.exit(1)
        elif ext!='.docx':
            print("can not read" + path + "!\nPlease check out that whether the format of the file is doc/docx!!!")
            sys.exit(1)
        old_string=sys.argv[2]#old_string="你好|好的|谢谢"
        new_string=sys.argv[3]#new_string="你好啊|嗯嗯|不客气"
        olds=old_string.split('/')
        news=new_string.split('/')
        if(len(olds)!=len(news)):
            print('The number of replacement strings does not match the number of replaced strings,Please Check!')
            print('Old string:',olds)
            print('New string:',news)
            sys.exit(1)
    
     
        path=basename + '.docx'
        file =docx.Document(path)
    
        for i in range(len(olds)):
            for paragraph in file.paragraphs:
                paragraph.text = paragraph.text.replace(olds[i],news[i])
        #file.save('test'+'_temp.docx')
        file.save(basename + '_temp.docx')
        print('succes!\n'
              'new file is shown in ' + basename+'_temp.docx')

     

    展开全文
  • C#操作Word文档(根据模板生成文档、替换内容、插入表格等)
  • 最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索。1、原有word模板...

    最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索。

    1、原有word模板内容如下:

    2、在想要插入数据的地方,插入书签,之后会在代码中获取书签并遍历插入内容。


    3、直接上代码。

    (1)首先我将word模板文件路径配置在config.properties文件中

    soil_word_template=/template/soil-report.docx
    soil_word_filename=soil-report.docx
    (2)然后是controller层
    /**
    	 * 根据表名统计土壤墒情数据并导出word文档
    	 * 
    	 * @param table
    	 *            表名
    	 * @param cropDate
    	 *            监测日期
    	 * @param file
    	 *            BASE64编码的图片文件
    	 * @param request
    	 * @param response
    	 * @return
    	 */
    	@ApiOperation("根据表名统计土壤墒情数据并导出word文档")
    	@RequestMapping(value = "/exportWordReport", method = RequestMethod.POST)
    	@ApiImplicitParams({ @ApiImplicitParam(name = "table", value = "表名",required=false,dataType="query"), @ApiImplicitParam(name="cropDate",value="监测日期",required=false,dataType="query"),
    		@ApiImplicitParam(name = "file", value = "BASE64编码的图片字符",required=false,dataType="query")})
    	public void exportWordReport(String table, String cropDate, String file, HttpServletRequest request,
    			HttpServletResponse response) {
    		// soil_word_template=/template/soil-report.docx
    		// soil_word_filename=soil-report.docx
    		ServletOutputStream out = null;
    		InputStream in = null;
    		File resultFile = null;
    		try {
    			// 土壤墒情word文档模板路径
    			String path = request.getServletContext().getRealPath("") + PropertyUtil.get("soil_word_template");
    			String tempPath = request.getServletContext().getRealPath("");
    			WordprocessingMLPackage wPackage = soilService.exportWordReport(table, cropDate, file, path);
    			// 设置文件属性
    			// wPackage.save(new File("C:\\Users\\admin\\Desktop\\" +
    			// PropertyUtil.get("soil_word_filename")));
    			String fileName = PropertyUtil.get("soil_word_filename");
    			String msg = new String((fileName).getBytes("UTF-8"), "ISO8859-1");
    			response.setContentType("application/msword");
    			response.addHeader("Content-Disposition", "attachment;filename=" + msg);
    
    			// response.setContentType("application/octet-stream");
    			// response.setContentType("application/vnd.ms-excel");
    			response.setCharacterEncoding("UTF-8");
    			// response.addHeader("result", "ok");
    			// response.setContentType("multipart/form-data");
    			out = response.getOutputStream();
    			String strDate = DateUtil.date2String(new Date(), DateUtil.DATE_FORMAT2);
    			resultFile = new File(tempPath + "/tempfile", "soil-report(" + strDate + ").docx");
    			wPackage.save(resultFile);
    			in = new FileInputStream(resultFile);
    			byte[] buffer = new byte[1024];
    			int len = 0;
    			while ((len = in.read(buffer)) > 0) {
    				out.write(buffer, 0, len);
    			}
    			// wPackage.save(out);
    			// wPackage.save(new File("C:\\Users\\admin\\Desktop\\",
    			// "dddd1111.docx"));
    		} catch (Exception e) {
    			Log.error(e);
    		} finally {
    			try {
    				if (out != null) {
    					out.flush();
    					out.close();
    				}
    				if (in != null) {
    					in.close();
    					if (resultFile != null && resultFile.exists() && resultFile.isFile()) {
    						resultFile.delete();
    					}
    				}
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}

    controller 层中需要注意的地方的是,最开始我用

    wPackage.save(out);//直接输出到response的ServletOutPutStream流中,但是这种方式会报错,好像是socket异常之类的问题。

    后来改成了代码中的方式,先将文件导出到项目src的webapp文件夹的tempfile文件夹中,然后再从此文件夹中读取该文件,并用out.write()方式输出便能成功执行导出word,前端紧接着下载该word即可。

                            int len = 0;
    			while ((len = in.read(buffer)) > 0) {
    				out.write(buffer, 0, len);
    			}

    (3)service层以及serviceImpl层代码

    首先来看看咱们需要

    是SoilService层代码:

    	/**SoilService层
    	 * 根据表名进行统计并导出word报告文档
    	 * 
    	 * @param tableName 表名
    	 * @param cropDate 监测日期
    	 * @param file  base64编码的图片文件字符串
    	 * @param path  word模板文件路径
    	 * @return Map<String, Object>
    	 */
    	WordprocessingMLPackage exportWordReport(String tableName, String cropDate, String file, String path);

    然后贴上SoilServiceImpl代码:

    	/**
    	 * 根据表名进行统计并导出word报告文档
    	 * 
    	 * @param tableName
    	 * @param where
    	 * @param file
    	 * @return Map<String, Object>
    	 */
    	@Override
    	public WordprocessingMLPackage exportWordReport(String tableName, String cropDate, String file, String path) {
    		// TODO Auto-generated method stub
    
    		Map<String, Object> resultMap = new HashMap<String, Object>();
    		// DecimalFormat decimalFormat = new DecimalFormat("0.00");
    		// 此处可能添加过滤非监测区的条件
    		String where = " \"GRIDCODE\"<8 ";
    		resultMap = findStatisticsDateByTableName(tableName, where);
    		JSONArray jsonArray = (JSONArray) resultMap.get("data1");
    		double totalArea = 0.0; // 有效监测区面积
    		double tooMuchArea = 0.0; // 过多面积1
    		double suitableArea = 0.0;// 适宜面积2
    		double notEnoughArea = 0.0;// 不足面积3
    		double lightDroughtArea = 0.0;// 轻旱面积4
    		double middleDroughtArea = 0.0;// 中旱面积5
    		double heavyDroughtArea = 0.0;// 重旱面积6
    		double extremeDroughtArea = 0.0;// 极旱面积7
    		// double notMonitorArea =0.0; //非监测区8
    
    		double tooMuchRate = 0.0; // 过多面积占比1
    		double suitableRate = 0.0;// 适宜面积2
    		double notEnoughRate = 0.0;// 不足面积3
    		double lightDroughtRate = 0.0;// 轻旱面积4
    		double middleDroughtRate = 0.0;// 中旱面积5
    		double heavyDroughtRate = 0.0;// 重旱面积6
    		double extremeDroughtRate = 0.0;// 极旱面积7
    		// double notMonitorRate =0.0; //非监测区8
    
    		for (Object obj : jsonArray) {
    			JSONObject jsonObject = (JSONObject) obj;
    			String gridcode = jsonObject.getString("gridcode");
    			double area = jsonObject.getDoubleValue("area");
    			if ("1".equals(gridcode)) {
    				tooMuchArea = area * Constant.I;
    			} else if ("2".equals(gridcode)) {
    				suitableArea = area * Constant.I;
    			} else if ("3".equals(gridcode)) {
    				notEnoughArea = area * Constant.I;
    			} else if ("4".equals(gridcode)) {
    				lightDroughtArea = area * Constant.I;
    			} else if ("5".equals(gridcode)) {
    				middleDroughtArea = area * Constant.I;
    			} else if ("6".equals(gridcode)) {
    				heavyDroughtArea = area * Constant.I;
    			} else if ("7".equals(gridcode)) {
    				extremeDroughtArea = area * Constant.I;
    			}
    			// }else if("8".equals(gridcode)){
    			// notMonitorArea =area;
    			// }
    			totalArea += area * Constant.I;
    		}
    		if (totalArea != 0.0) {
    			tooMuchRate = Double.valueOf(DECIMAL_FORMAT.format((tooMuchArea / totalArea) * 100));
    			suitableRate = Double.valueOf(DECIMAL_FORMAT.format((suitableArea / totalArea) * 100));
    			notEnoughRate = Double.valueOf(DECIMAL_FORMAT.format((notEnoughArea / totalArea) * 100));
    			lightDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((lightDroughtArea / totalArea) * 100));
    			middleDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((middleDroughtArea / totalArea) * 100));
    			heavyDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((heavyDroughtArea / totalArea) * 100));
    			extremeDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((extremeDroughtArea / totalArea) * 100));
    		}
    		Map<String, Object> map = new HashMap<String, Object>();
    
    		map.put("cropDate", cropDate);
    		map.put("totalArea", DECIMAL_FORMAT.format(totalArea));
    		map.put("mTotalArea", DECIMAL_FORMAT.format(totalArea / Constant.I * Constant.M));
    		map.put("tooMuchArea", DECIMAL_FORMAT.format(tooMuchArea));
    		map.put("suitableArea", DECIMAL_FORMAT.format(suitableArea));
    		map.put("notEnoughArea", DECIMAL_FORMAT.format(notEnoughArea));
    		map.put("lightDroughtArea", DECIMAL_FORMAT.format(lightDroughtArea)); 
    		map.put("middleDroughtArea", DECIMAL_FORMAT.format(middleDroughtArea));
    		map.put("heavyDroughtArea", DECIMAL_FORMAT.format(heavyDroughtArea));
    		map.put("extremeDroughtArea", DECIMAL_FORMAT.format(extremeDroughtArea));
    		
    		map.put("tooMuchAreaM", DECIMAL_FORMAT.format(tooMuchArea/ Constant.I * Constant.M));
    		map.put("suitableAreaM", DECIMAL_FORMAT.format(suitableArea/ Constant.I * Constant.M));
    		map.put("notEnoughAreaM", DECIMAL_FORMAT.format(notEnoughArea/ Constant.I * Constant.M));
    		map.put("lightDroughtAreaM", DECIMAL_FORMAT.format(lightDroughtArea/ Constant.I * Constant.M)); 
    		map.put("middleDroughtAreaM", DECIMAL_FORMAT.format(middleDroughtArea/ Constant.I * Constant.M));
    		map.put("heavyDroughtAreaM", DECIMAL_FORMAT.format(heavyDroughtArea/ Constant.I * Constant.M));
    		map.put("extremeDroughtAreaM", DECIMAL_FORMAT.format(extremeDroughtArea/ Constant.I * Constant.M));
    
    		map.put("tooMuchRate", tooMuchRate);
    		map.put("suitableRate", suitableRate);
    		map.put("notEnoughRate", notEnoughRate);
    		map.put("lightDroughtRate", lightDroughtRate);
    		map.put("middleDroughtRate", middleDroughtRate);
    		map.put("heavyDroughtRate", heavyDroughtRate);
    		map.put("extremeDroughtRate", extremeDroughtRate);
    
    		String sql = "SELECT *  from (SELECT \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\",SUM(\"AREA\") \"AREA\"  FROM \""
    				+ tableName
    				+ "\" WHERE \"GRIDCODE\"<8 AND \"GRIDCODE\"  IS NOT NULL group by \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\") A "
    				+ "WHERE A.\"AREA\"!=0 AND A.\"AREA\" IS NOT NULL";
    		String totalAreaSql = "SELECT SUM(\"AREA\") \"TOTALAREA\"  from (SELECT \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\",SUM(\"AREA\") \"AREA\"  FROM \""
    				+ tableName
    				+ "\" WHERE \"GRIDCODE\"<8 AND \"GRIDCODE\"  IS NOT NULL group by \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\") A "
    				+ "WHERE A.\"AREA\"!=0 AND A.\"AREA\" IS NOT NULL";
    		List<Object[]> list = getBySql(sql, null);
    		double soilTotalArea = Double.valueOf(Objects.toString(getBySql(totalAreaSql, null).get(0), "0.0"))
    				* Constant.M;
    		List<SoilDtoEntityRate> soilList = list.parallelStream().map(x -> coverProperty(x, soilTotalArea))
    				.collect(Collectors.toList());
    		map.put("table", soilList);
    		// map.put("soilTotalArea", soilTotalArea);
    		map.put("img", file);
    		try {
    			WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(path));
    			replaceContentByBookmark(wPackage, map);
    			// wPackage.save(new File("C:\\Users\\admin\\Desktop\\" +
    			// PropertyUtil.get("soil_word_filename")));
    			return wPackage;
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Docx4JException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}
    /**
    	 * 根据多个标签替换段落中的内容
    	 * 
    	 * @param map
    	 */
    	public void replaceContentByBookmark(WordprocessingMLPackage wPackage, Map<String, Object> map) {
    		// 载入模板文件
    		try {
    			// 提取正文
    			MainDocumentPart main = wPackage.getMainDocumentPart();
    			Document doc = main.getContents();
    			Body body = doc.getBody();
    			// ObjectFactory factory = Context.getWmlObjectFactory();
    			// 获取段落
    			List<Object> paragraphs = body.getContent();
    			// 提取书签并创建书签的游标
    			RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
    			new TraversalUtil(paragraphs, rt);
    
    			// 遍历书签(在书签处插入文本内容和书签)
    			for (CTBookmark bm : rt.getStarts()) {
    				// 这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理
    				if (!bm.getName().equals(DocUtil.tableName)) {
    					if (bm.getName().equals(DocUtil.imageBookMarkName)) { // 图片
    						String file = (String) map.get(bm.getName());
    						if (StringUtils.isNotBlank(file)) {
    							// InputStream inputStream =file.getInputStream();
    							DocUtil.addImage(wPackage, bm, file);
    						}
    					} else {
    						DocUtil.replaceText(bm, map.get(bm.getName()));
    					}
    				} else { // 表格
    					List<SoilDtoEntityRate> list = (List<SoilDtoEntityRate>) map.get(bm.getName());
    					// 创建表格
    					int rowIndex = 2; // 从第三行开始写起(表格从0开始)
    					Tbl tbl = Doc4JUtil.createTable(wPackage, list.size() + rowIndex, 6);
    					Doc4JUtil.mergeCellsHorizontal(tbl, 0, 0, 5);
    					// 设置表格大标题
    					P p = Doc4JUtil.createP("农作物墒情统计列表", "36");
    					Doc4JUtil.setTcValue(tbl, 0, 0, p);
    					// 设置表格副标题
    					Doc4JUtil.setTcValue(tbl, 1, 0, "县区");
    					Doc4JUtil.setTcValue(tbl, 1, 1, "乡镇");
    					Doc4JUtil.setTcValue(tbl, 1, 2, "作物");
    					Doc4JUtil.setTcValue(tbl, 1, 3, "墒情等级");
    					Doc4JUtil.setTcValue(tbl, 1, 4, "面积(亩)");
    					Doc4JUtil.setTcValue(tbl, 1, 5, "占比");
    
    					Map<String, List<SoilDtoEntityRate>> provinceCollect = list.stream()
    							.collect(Collectors.groupingBy(x -> x.getProvince() == null ? "" : x.getProvince()));
    
    					for (Entry<String, List<SoilDtoEntityRate>> proEntry : provinceCollect.entrySet()) {
    
    						Map<String, List<SoilDtoEntityRate>> cityCollect = proEntry.getValue().stream()
    								.collect(Collectors.groupingBy(x -> x.getCity() == null ? "" : x.getCity()));
    						for (Entry<String, List<SoilDtoEntityRate>> cityEntry : cityCollect.entrySet()) {
    							Map<String, List<SoilDtoEntityRate>> countyCollect = cityEntry.getValue().stream()
    									.collect(Collectors.groupingBy(x -> x.getCounty() == null ? "" : x.getCounty()));
    
    							for (Entry<String, List<SoilDtoEntityRate>> countyEntry : countyCollect.entrySet()) {
    								operateCounty(countyEntry, rowIndex, tbl);
    								rowIndex += countyEntry.getValue().size();
    							}
    
    						}
    
    					}
    					Doc4JUtil.setTblAllJcAlign(tbl, JcEnumeration.CENTER);
    					Doc4JUtil.setTblAllVAlign(tbl, STVerticalJc.CENTER);
    					wPackage.getMainDocumentPart().addObject(tbl);
    				}
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 写入县区数据
    	 * 
    	 * @param countyEntry
    	 * @param rowIndex
    	 * @param tbl
    	 */
    	private void operateCounty(Entry<String, List<SoilDtoEntityRate>> countyEntry, int rowIndex, Tbl tbl) {
    		// TODO Auto-generated method stub
    		// 获取每个entry的记录条数
    		int beginRow = rowIndex;
    		int size = countyEntry.getValue().size();
    		// 处理县区
    		// 合并单元格
    		Doc4JUtil.mergeCellsVertically(tbl, 0, beginRow, beginRow + size);
    		Doc4JUtil.setTcValue(tbl, beginRow, 0, countyEntry.getKey());
    		// 处理镇
    		Map<String, List<SoilDtoEntityRate>> townCollect = countyEntry.getValue().stream()
    				.collect(Collectors.groupingBy(x -> x.getTown() == null ? "" : x.getTown()));
    		for (Entry<String, List<SoilDtoEntityRate>> townEntry : townCollect.entrySet()) {
    			operateTown(townEntry, beginRow, tbl);
    			beginRow += townEntry.getValue().size();
    		}
    	}
    
    	/**
    	 * 写入镇数据
    	 * 
    	 * @param townEntry
    	 * @param rowIndex
    	 * @param tbl
    	 */
    	private void operateTown(Entry<String, List<SoilDtoEntityRate>> townEntry, int rowIndex, Tbl tbl) {
    		// TODO Auto-generated method stub
    		// 获取每个entry的记录条数
    		int beginRow = rowIndex;
    		int size = townEntry.getValue().size();
    		// 处理县区
    		// 合并单元格
    		Doc4JUtil.mergeCellsVertically(tbl, 1, beginRow, beginRow + size);
    		Doc4JUtil.setTcValue(tbl, beginRow, 1, townEntry.getKey());
    		Map<String, List<SoilDtoEntityRate>> cropCollect = townEntry.getValue().stream().sorted((x, j) -> {
    			return (int) (x.getGridcode() - j.getGridcode());
    		}).collect(Collectors.groupingBy(x -> x.getCroptype() == null ? "" : x.getCroptype()));
    		for (Entry<String, List<SoilDtoEntityRate>> cropEntry : cropCollect.entrySet()) {
    			operateCropType(cropEntry, beginRow, tbl);
    			beginRow += cropEntry.getValue().size();
    		}
    
    	}
    
    	/**
    	 * 写入种植类型、土壤墒情等级,面积,占比
    	 * 
    	 * @param cropEntry
    	 * @param rowIndex
    	 * @param tbl
    	 */
    	private void operateCropType(Entry<String, List<SoilDtoEntityRate>> cropEntry, int rowIndex, Tbl tbl) {
    		// TODO Auto-generated method stub
    
    		int beginRow = rowIndex;
    		int size = cropEntry.getValue().size();
    		// 处理县区
    		// 合并单元格
    		Doc4JUtil.mergeCellsVertically(tbl, 2, beginRow, beginRow + size);
    		Doc4JUtil.setTcValue(tbl, beginRow, 2, cropEntry.getKey());
    		List<SoilDtoEntityRate> soilList = cropEntry.getValue();
    		for (int i = 0; i < size; i++) {
    			Doc4JUtil.setTcValue(tbl, beginRow + i, 3, gridCodeMap.get(soilList.get(i).getGridcode()));
    			Doc4JUtil.setTcValue(tbl, beginRow + i, 4, String.valueOf(soilList.get(i).getArea()));
    			Doc4JUtil.setTcValue(tbl, beginRow + i, 5, soilList.get(i).getRate());
    		}
    	}
    public SoilDtoEntityRate coverProperty(Object[] x, double totalSoilArea) {
    		String rate = "0.00%";
    		double area = Double.valueOf(Objects.toString(x[6], "0")) * Constant.M;
    		area = Double.valueOf(DECIMAL_FORMAT.format(area));
    		if (totalSoilArea != 0) {
    			rate = DECIMAL_FORMAT.format((area / totalSoilArea) * 100) + "%";
    		}
    		return new SoilDtoEntityRate(Objects.toString(x[0], ""), Objects.toString(x[1], ""), Objects.toString(x[2], ""),
    				Objects.toString(x[3], ""), Objects.toString(x[4], ""), Double.valueOf(Objects.toString(x[5], "0")),
    				area, rate);
    	}

    接下来是以上业务代码中用到的工具类中的方法:

      /**
         * @Description:创建表格(默认水平居中,垂直居中)
         */
        public static Tbl createTable(WordprocessingMLPackage wordPackage, int rowNum,
                               int colsNum) throws Exception {
            colsNum = Math.max(1, colsNum);
            rowNum = Math.max(1, rowNum);
            int widthTwips = getWritableWidth(wordPackage);
            int colWidth = widthTwips / colsNum;
            int[] widthArr = new int[colsNum];
            for (int i = 0; i < colsNum; i++) {
                widthArr[i] = colWidth;
            }
            return createTable(rowNum, colsNum, widthArr);
        }
    
        /**
         * @Description:创建表格(默认水平居中,垂直居中)
         */
        public static Tbl createTable(int rowNum, int colsNum, int[] widthArr)
                throws Exception {
            colsNum = Math.max(1, Math.min(colsNum, widthArr.length));
            rowNum = Math.max(1, rowNum);
            Tbl tbl = new Tbl();
            StringBuffer tblSb = new StringBuffer();
            tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION)
                    .append(">");
            tblSb.append("<w:tblStyle w:val=\"TableGrid\"/>");
            tblSb.append("<w:tblW w:w=\"0\" w:type=\"auto\"/>");
            // 上边框
            tblSb.append("<w:tblBorders>");
            tblSb.append("<w:top w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            // 左边框
            tblSb.append("<w:left w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            // 下边框
            tblSb.append("<w:bottom w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            // 右边框
            tblSb.append("<w:right w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            tblSb.append("<w:insideH w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            tblSb.append("<w:insideV w:val=\"single\" w:sz=\"1\" w:space=\"0\" w:color=\"auto\"/>");
            tblSb.append("</w:tblBorders>");
            tblSb.append("</w:tblPr>");
            TblPr tblPr = null;
            tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());
            Jc jc = new Jc();
            // 单元格居中对齐
            jc.setVal(JcEnumeration.CENTER);
            tblPr.setJc(jc);
    
            tbl.setTblPr(tblPr);
    
            // 设定各单元格宽度
            TblGrid tblGrid = new TblGrid();
            tbl.setTblGrid(tblGrid);
            for (int i = 0; i < colsNum; i++) {
                TblGridCol gridCol = new TblGridCol();
                gridCol.setW(BigInteger.valueOf(widthArr[i]));
                tblGrid.getGridCol().add(gridCol);
            }
            // 新增行
            for (int j = 0; j < rowNum; j++) {
                Tr tr = new Tr();
                tbl.getContent().add(tr);
                // 列
                for (int i = 0; i < colsNum; i++) {
                    Tc tc = new Tc();
                    tr.getContent().add(tc);
    
                    TcPr tcPr = new TcPr();
                    TblWidth cellWidth = new TblWidth();
                    cellWidth.setType("dxa");
                    cellWidth.setW(BigInteger.valueOf(widthArr[i]));
                    tcPr.setTcW(cellWidth);
                    tc.setTcPr(tcPr);
    
                    // 垂直居中
                    setTcVAlign(tc, STVerticalJc.CENTER);
                    P p = new P();
                    PPr pPr = new PPr();
                    pPr.setJc(jc);
                    p.setPPr(pPr);
                    R run = new R();
                    p.getContent().add(run);
                    tc.getContent().add(p);
                }
            }
            return tbl;
        }
    
      /**
         * @Description: 跨列合并
         */
        public static void mergeCellsHorizontal(Tbl tbl, int row, int fromCell, int toCell) {
            if (row < 0 || fromCell < 0 || toCell < 0) {
                return;
            }
            List<Tr> trList = getTblAllTr(tbl);
            if (row > trList.size()) {
                return;
            }
            Tr tr = trList.get(row);
            List<Tc> tcList = getTrAllCell(tr);
            for (int cellIndex = fromCell, len = Math
                    .min(tcList.size() - 1, toCell); cellIndex <= len; cellIndex++) {
                Tc tc = tcList.get(cellIndex);
                TcPr tcPr = getTcPr(tc);
                HMerge hMerge = tcPr.getHMerge();
                if (hMerge == null) {
                    hMerge = new HMerge();
                    tcPr.setHMerge(hMerge);
                }
                if (cellIndex == fromCell) {
                    hMerge.setVal("restart");
                } else {
                    hMerge.setVal("continue");
                }
            }
        }
     /**
         * 插入图片
         * @param wPackage
         * @param bm
         * @param file
         */
    	public static void addImage(WordprocessingMLPackage wPackage, CTBookmark bm, String file) {
    		try {
    			// 这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理
    			// 获取该书签的父级段落
    			P p = (P) (bm.getParent());
    			// R对象是匿名的复杂类型,然而我并不知道具体啥意思,估计这个要好好去看看ooxml才知道
    			R run = factory.createR();
    			// 读入图片并转化为字节数组,因为docx4j只能字节数组的方式插入图片
    	        byte[] bytes = FileUtil.getByteFormBase64DataByImage(file);
    
    		//	InputStream is = new FileInputStream;
    		//	byte[] bytes = IOUtils.toByteArray(inputStream);
    			// byte[] bytes = FileUtil.getByteFormBase64DataByImage("");
    			// 开始创建一个行内图片
    			BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes);
    			// createImageInline函数的前四个参数我都没有找到具体啥意思,,,,
    			// 最有一个是限制图片的宽度,缩放的依据
    			Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 0);
    			// 获取该书签的父级段落
    			// drawing理解为画布?
    			Drawing drawing = factory.createDrawing();
    			drawing.getAnchorOrInline().add(inline);
    			run.getContent().add(drawing);
    			p.getContent().add(run);
    		} catch (Exception e) {
    			// TODO: handle exception
    			Log.error(e);
    		}
    	}

    /**
    	 * 在标签处插入内容
    	 * 
    	 * @param bm
    	 * @param wPackage
    	 * @param object
    	 * @throws Exception
    	 */
    	public static void replaceText(CTBookmark bm,  Object object) throws Exception {
    		if (object == null) {
    			return;
    		}
    		// do we have data for this one?
    		if (bm.getName() == null)
    			return;
    		String value = object.toString();
    		Log.info("标签名称:"+bm.getName());
    		try {
    			// Can't just remove the object from the parent,
    			// since in the parent, it may be wrapped in a JAXBElement
    			List<Object> theList = null;
    			ParaRPr rpr = null;
    			if (bm.getParent() instanceof P) {
    				PPr pprTemp = ((P) (bm.getParent())).getPPr();
    				if (pprTemp == null) {
    					rpr = null;
    				} else {
    					rpr = ((P) (bm.getParent())).getPPr().getRPr();
    				}
    				theList = ((ContentAccessor) (bm.getParent())).getContent();
    			} else {
    				return;
    			}
    			int rangeStart = -1;
    			int rangeEnd = -1;
    			int i = 0;
    			for (Object ox : theList) {
    				Object listEntry = XmlUtils.unwrap(ox);
    				if (listEntry.equals(bm)) {
    
    					if (((CTBookmark) listEntry).getName() != null) {
    
    						rangeStart = i + 1;
    
    					}
    				} else if (listEntry instanceof CTMarkupRange) {
    					if (((CTMarkupRange) listEntry).getId().equals(bm.getId())) {
    						rangeEnd = i - 1;
    
    						break;
    					}
    				}
    				i++;
    			}
    			int x = i - 1;
    			//if (rangeStart > 0 && x >= rangeStart) {
    				// Delete the bookmark range
    				for (int j = x; j >= rangeStart; j--) {
    					theList.remove(j);
    				}
    				// now add a run
    				org.docx4j.wml.R run = factory.createR();
    				org.docx4j.wml.Text t = factory.createText();
    				// if (rpr != null)
    				// run.setRPr(paraRPr2RPr(rpr));
    				t.setValue(value);
    				run.getContent().add(t);
    				//t.setValue(value);
    
    				theList.add(rangeStart, run);
    			//}
    		} catch (ClassCastException cce) {
    			Log.error(cce);
    		}
    	}
     /**
         * @Description: 跨行合并
         */
        public static void mergeCellsVertically(Tbl tbl, int col, int fromRow, int toRow) {
            if (col < 0 || fromRow < 0 || toRow < 0) {
                return;
            }
            for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
                Tc tc = getTc(tbl, rowIndex, col);
                if (tc == null) {
                    break;
                }
                TcPr tcPr = getTcPr(tc);
                VMerge vMerge = tcPr.getVMerge();
                if (vMerge == null) {
                    vMerge = new VMerge();
                    tcPr.setVMerge(vMerge);
                }
                if (rowIndex == fromRow) {
                    vMerge.setVal("restart");
                } else {
                    vMerge.setVal("continue");
                }
            }
        }

    至此,大家就可以看到导出的word文档效果了,如下图:


    最后,大家在遇到此类问题的时候也可参考本篇博客,同时本人初次发表博客,时间仓促,尚且还有不妥之处,欢迎指正!

    展开全文
  • Android 读写word文档,按照指定位置插入文字,替换文字,表格,图片,替换表格中文字图片,自己亲测,不需要添加其他太多poi包造成工程错误
  • Word文档批量替换工具

    千次阅读 2019-07-01 11:25:01
    作者:iamlaosong 日常工作中可能会碰到...本工具可以实现一键完成批量替换,只需按键前将要替换内容输入表格当中。工具用VBA实现,主要是针对ISO认证标准化文档做的,即对多个文件做同样的替换。界面如下: ...

    作者:iamlaosong

    日常工作中可能会碰到这样的情况,就是需要批量替换一些文件的内容,如合同、产品说明、ISO认证标准化文档(质量手册、程序文件、管理手册)、项目推广方案等,先做批量替换,再进行修改,可以节省大量时间。

    本工具可以实现一键完成批量替换,只需按键前将要替换的内容输入表格当中。工具用VBA实现,主要是针对ISO认证标准化文档做的,即对多个文件做同样的替换。界面如下:

     

    功能简单,实现起来也容易。也就是读取表格内容到数组,选择要替换的文件,然后逐个替换即可。

    1、文件夹替换:点击按钮选择一个文件夹,工具对文件夹下所有Word文档进行替换,替换后的文件保留在当前文件夹下新建的new文件夹下,文件名和源文件相同。

    2、文件替换:点击按钮后选择一个或多个Word文档,工具对对选中的文档进行替换,替换后的文件保留在当前文件夹下新建的new文件夹下,文件名和源文件相同。

    本来想用Excel VBA做的(毕竟这个我比较熟),可是Excel VBA代码写完后,打开Word文档没问题,其他代码执行没问题,就是替换功能那部分代码执行了完不成替换,而同样的代码在Word VBA中却可以实现所需的功能,不知道问题出在哪儿。

    核心代码如下:

    1、读取表格内容:

        '读取替换内容
        For k = 2 To 100
           tmp = ActiveDocument.Tables(1).Cell(k, 1)
           sFind(k) = Left(tmp, Len(tmp) - 2)
           tmp = ActiveDocument.Tables(1).Cell(k, 2)
           sRepl(k) = Left(tmp, Len(tmp) - 2)
           If sFind(k) = "" Then Exit For
        Next k
        WordNo = k - 1
    

    2、批量替换

        If Dir(sPath & "\new", vbDirectory) = "" Then MkDir sPath & "\new"
        '开始替换
        For kk = 1 To FileNo
            Target = sPath & "\" & myFile(kk)
            Debug.Print Target
            Documents.Open Target
                
            For k = 2 To WordNo
                Selection.Find.ClearFormatting
                Selection.Find.Replacement.ClearFormatting
                With Selection.Find
                    .Text = sFind(k)
                    .Replacement.Text = sRepl(k)
                    .Forward = True
                    .Wrap = wdFindContinue
                    .Format = False
                    .MatchCase = False
                    .MatchWholeWord = False
                    .MatchByte = True
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    '执行替换
                    .Execute Replace:=wdReplaceAll
                End With
            Next k
            ActiveDocument.SaveAs2 FileName:=sPath & "\new\" & myFile(kk)
            'ActiveDocument.Save
            ActiveDocument.Close
        Next kk
        
        MsgBox "共有" & FileNo & "个文件替换完毕!"
    

     

    感兴趣朋友可以下载试试:Word文档批量替换工具.doc

    补记:

    后来发现,Excel之所以不行,是因为Excel环境下wdReplaceAll、wdFindContinue都是空值。而这些参数为空值,是因为我们没有引用Word对象,引用一下就不是空值了(如果把wdReplaceAll、wdFindContinue等常量换成其值2、1,不引用也可以),如下图:

    Excel下面的关键代码如下:

            '查找并替换
            For k = 1 To Strno
                With docApp.Selection.Find
                    .ClearFormatting
                    .Text = arrStr(k, 1)
                    .Replacement.Text = arrStr(k, 2)
                    .Forward = True
                    .Wrap = wdFindContinue
                    .MatchWildcards = False
                End With
                docApp.Selection.Find.Execute Replace:=wdReplaceAll
            Next k
    

    注意:docApp是Word应用对象,即:Set docApp = CreateObject("Word.Application")

     

    展开全文
  • 在C# 在word中查找及替换文本一文中,主要介绍了在Word中以文本替换文本的方法,在本篇文章中,将介绍如何用一篇Word文档、图片或者表格替换文档中的指定文本字符串。示例要点如下: 1. 用文档替换Word中的文本 ...

    编辑文档时,对一些需要修改的字符或段落可以通过查找替换的方式,快速地更改。在C# 在word中查找及替换文本一文中,主要介绍了在Word中以文本替换文本的方法,在本篇文章中,将介绍如何用一篇Word文档、图片或者表格来替换文档中的指定文本字符串。示例要点如下:

    1. 用文档替换Word中的文本

    2. 用图片替换Word中的文本

    3. 用表格替换Word中的文本

     

    工具

    下载安装后,注意在程序中添加引用Spire.Doc.dll(如下图),dll文件可在安装路径下的Bin文件夹中获取。

    C#代码示例

    【示例1】用文档替换Word中的文本

    测试文档:

    步骤1:加载文档

    //加载源文档
    Document document = new Document("Original.docx");
    
    //加载用于替换的文档
    IDocument replaceDocument = new Document("test.docx");

    步骤2:用文档替换文本

    document.Replace("History", replaceDocument, false, true);

    步骤3:保存文档

    document.SaveToFile("result.docx", FileFormat.Docx2013);

    替换结果:

     

    全部代码:

    using Spire.Doc;
    using Spire.Doc.Interface;
    
    namespace ReplaceTextWithDocument_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //加载源文档
                Document document = new Document("Original.docx");
    
                //加载用于替换的文档
                IDocument replaceDocument = new Document("test.docx");
    
                //用文档替换源文档中的指定文本
                document.Replace("History", replaceDocument, false, true);
    
                //保存文档
                document.SaveToFile("result.docx", FileFormat.Docx2013);
                System.Diagnostics.Process.Start("result.docx");
            }
        }
    }
    View Code

     

     

    【示例2】用图片替换Word中的文本

    测试文档:

    步骤1:加载文件

    //实例化Document类的对象,并加载测试文档
    Document doc = new Document();
    doc.LoadFromFile("testfile.docx");
    //加载替换的图片
    Image image = Image.FromFile("g.png");

    步骤2:查找需要替换掉的文本字符串

    //获取第一个section
    Section sec= doc.Sections[0];
    
    //查找文档中的指定文本内容
    TextSelection[] selections = doc.FindAllString("Google", true, true);
    int index = 0;
    TextRange range = null;

    步骤3:用图片替换文本

    //遍历文档,移除文本内容,插入图片
    foreach (TextSelection selection in selections)
    {
        DocPicture pic = new DocPicture(doc);
        pic.LoadImage(image);
        range = selection.GetAsOneRange();
        index = range.OwnerParagraph.ChildObjects.IndexOf(range);
        range.OwnerParagraph.ChildObjects.Insert(index, pic);
        range.OwnerParagraph.ChildObjects.Remove(range);
    }

    步骤4:保存文档

    doc.SaveToFile("result.docx", FileFormat.Docx);

    替换结果:

    全部代码:

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    using System.Drawing;
    
    namespace ReplaceTextWithImg_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //实例化Document类的对象,并加载测试文档
                Document doc = new Document();
                doc.LoadFromFile("testfile.docx");
                //加载替换的图片
                Image image = Image.FromFile("g.png");
    
                //获取第一个section
                Section sec= doc.Sections[0];
    
                //查找文档中的指定文本内容
                TextSelection[] selections = doc.FindAllString("Google", true, true);
                int index = 0;
                TextRange range = null;
    
                //遍历文档,移除文本内容,插入图片
                foreach (TextSelection selection in selections)
                {
                    DocPicture pic = new DocPicture(doc);
                    pic.LoadImage(image);
                    range = selection.GetAsOneRange();
                    index = range.OwnerParagraph.ChildObjects.IndexOf(range);
                    range.OwnerParagraph.ChildObjects.Insert(index, pic);
                    range.OwnerParagraph.ChildObjects.Remove(range);
                }
    
                //保存文档
                doc.SaveToFile("result.docx", FileFormat.Docx);
                System.Diagnostics.Process.Start("result.docx");
            }
        }
    }
    View Code

     

    【示例3】用表格替换Word中的文本

    测试文档:

     

    步骤1:加载文档

    Document doc = new Document();
    doc.LoadFromFile("test.docx");

    步骤2:查找关键字符串

    Section section = doc.Sections[0];
    TextSelection selection = doc.FindString("参考附录", true, true);

    步骤3:获取关键字符串所在段落的索引

    TextRange range = selection.GetAsOneRange();
    Paragraph paragraph = range.OwnerParagraph;
    Body body = paragraph.OwnerTextBody;
    int index = body.ChildObjects.IndexOf(paragraph);

    步骤4:添加表格

    Table table = section.AddTable(true);
    table.ResetCells(2, 3);
    range = table[0, 0].AddParagraph().AppendText("管号(McFarland)");
    range = table[0, 1].AddParagraph().AppendText("0.5");
    range = table[0, 2].AddParagraph().AppendText("1");
    range = table[1, 0].AddParagraph().AppendText("0.25%BaCl2(ml)");
    range = table[1, 1].AddParagraph().AppendText("0.2");
    range = table[1, 2].AddParagraph().AppendText("0.4");

    步骤5:移除段落,插入表格

    body.ChildObjects.Remove(paragraph);
    body.ChildObjects.Insert(index, table);

    步骤6:保存文档

    doc.SaveToFile("result.doc", FileFormat.Doc);

    替换结果:

    全部代码:

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    
    
    namespace ReplaceTextWithTable_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //实例化Document类的对象,并加载测试文档
                Document doc = new Document();
                doc.LoadFromFile("test.docx");
    
                //查找关键字符串文本
                Section section = doc.Sections[0];
                TextSelection selection = doc.FindString("参考附录", true, true);
    
                //获取关键字符串所在的段落
                TextRange range = selection.GetAsOneRange();
                Paragraph paragraph = range.OwnerParagraph;
                Body body = paragraph.OwnerTextBody;
                int index = body.ChildObjects.IndexOf(paragraph);
    
                //添加一个两行三列的表格
                Table table = section.AddTable(true);
                table.ResetCells(2, 3);
                range = table[0, 0].AddParagraph().AppendText("管号(McFarland)");
                range = table[0, 1].AddParagraph().AppendText("0.5");
                range = table[0, 2].AddParagraph().AppendText("1");
                range = table[1, 0].AddParagraph().AppendText("0.25%BaCl2(ml)");
                range = table[1, 1].AddParagraph().AppendText("0.2");
                range = table[1, 2].AddParagraph().AppendText("0.4");
    
                //移除段落,插入表格 
                body.ChildObjects.Remove(paragraph);
                body.ChildObjects.Insert(index, table);
    
                //保存文档
                doc.SaveToFile("result.doc", FileFormat.Doc);
                System.Diagnostics.Process.Start("result.doc");
                 
            }
        }
    }
    View Code

     

    以上是本次关于“C# 用文档、图片、表格替换Word中的文本字符串的”的全部内容。

    (本文完)

    转载于:https://www.cnblogs.com/Yesi/p/10031817.html

    展开全文
  • 注:本文由于个人工作需要,有对多个他人博文进行借鉴,...java代码对word文档进行文字,图片,表格的添加以及替换,效果图如下: 原文档: 替换后文档: 正文开始 前提:需要引入包 Spire.Doc.jar 大家可...
  • 在本篇文章中,将介绍如何用一篇Word文档、图片或者表格来替换文档中的指定文本字符串。示例要点如下: 用文档替换Word中的文本 用图片替换Word中的文本 用表格替换Word中的文本 工具 Free Spire.Doc for .NET ...
  • VBA做的工具,将需要替换的文字输入到表格中,然后一键完成多个文件的替换。特别适合一些格式化文件,比如合同、产品说明、ISO标准化文档(质量手册、程序文件、管理手册)、项目推广方案等,先做批量替换,再进行...
  • 使用poi组件自动填充模板word内容和图片.
  • python python-docx 替换word文档部分内容

    万次阅读 2018-03-14 16:39:02
    有人已经做了如何修改一些格式的博客:用python-docx修改已存在的Word文档表格的字体格式。 我这里给出替换内容给的例子,简单来说,就是使用一个函数.clear()清除原来内容,然后add_run增加内容: document = ...
  • 1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理就得整理半天,而且一旦要...
  • 如果想查看详情可将后缀名改为zip,再查看压缩文件可查看到各种文件,其中document.xml就是word主要展现给我们大家所看到的内容。2.根据第一步的描述,我查看了document.xml,如果有图片,xml文件里会有w:drawing节点...
  • 目录1、pom.xml2、制作.ftl模板2.1 创建word模板2.2 另存为xml格式,进行简单处理2.3 创建实体类2.4处理xml文件2.5修改后缀为ftl3、导出word方法3.1将demo.ftl放入resources/template3.2通用的word导出方法3.3执行...
  • 我的office2003的,如果在 word = new ... 下面是采用jacob对Word文档进行一些处理,Java2Word.Java和对其的测试Java2WordTest.java package com.word; import java.util.Iterator;<br /
  • 实现功能:从word文档中提取图片及表格,并用html代码替换,将处理后的word 文档存放到一个html文档中  /*  * 实现步骤:1、源word另存为html。可以得到图片和html文件。  * 2、从html文件中提取出table,...
  • 群里(Word学习交流群:180627193)一位朋友问到,如何一次性批量替换多个word文档中的同一内容。其实,实现多个Word文档的字符进行批量替换的方法有多种。(www.itblw.com)  第一种方法,可以利用第三方软件:...
  •  2需求 用户在系统上填写信息,保存后导出标准的word文档,用户在系统上填写的信息我们用富文本编辑工具kindEditor,这个插件可以将用户从word文档拷贝的表格标签保存,但是图片信息需要另行上传。
  • POI实现传入数据替换Word文档内容

    千次阅读 2018-07-05 09:19:16
    /** * @param srcPath:上传文件路径 * @param destPath:保存文件路径 * @param map:替换内容key对应word文档替换的值,value是替换内容。 * 例:map.put("title", "内容"); * @author ...
  • Word书签不但可以帮助读者快速跳转到想要查看的位置,...本文总结了一个将常见的Word文档元素(文字、图片和表格替换进书签的C#解决方案,具体步骤见下文。使用工具:Spire.Doc.dll 6.4.5 Visual Studio 2013步...
  • docx文档表格抽取(word)

    千次阅读 2017-06-29 17:04:15
    大家都知道用poi抽取出来的table没有格式只包含文本内容,所以这里我用 word表格提取—》表格单存为word-》word转pdf-》pdf转图片-》表格文本替换为图片url 这个思路来实现。话不多说,下面上代码
  • 替换文件夹下所有文档内容,需要替换文档不能打开,采用宏进行批量替换,亲测成功,测试是word2016 根据简书作者改编https://www.jianshu.com/p/9d348b8015b6?utm_campaign=maleskine&amp;utm_...
  • C#版本 NPOI 批量替换Word文档(doc文件)变量的方法。 网上各种代码都是直接替换run,但实际上很多变量是由多个run表示的,并不能直接用,本代码完美支持{变量}替换
  • //替换内容 para.ReplaceText(oldText, tempText); } } } } } } } //生成指定文件 FileStream output = new FileStream(targetPath, FileMode.Create); //将文档信息写入文件 doc.Write(output); //...
  • Word 2007 POI 替换文档内容

    千次阅读 2016-09-26 12:55:35
    最近项目中需要替换Word模版中的变量,本来打算用书签做的,后来发现POI的bookmark不具有设置标签内容的功能。如果采用getText(),则会丢失样式。 模版截图为 分为页眉、页脚、中间内容。 处理代码如下。...
  • * 将word文档中wmf图片导出并替换为标签 * * @param fileName * 文档完整名 * @return 修改后的文件名 */ public String exportWmfFromDoc(String fileName) { try { Document doc = new Document(filePath + ...
  • [实用]【更新中】Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)基于Apache POI对Word进行操作一、基于Apache POI封装的word文档工具V1.0介绍二、Apache POI 知识1. jar包(maven的,这个不多做解释...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,101
精华内容 6,840
关键字:

word文档表格内容替换