精华内容
下载资源
问答
  • 根据word模板定制报表

    2019-04-16 10:36:51
    根据word模板定制报表。 踩过的坑 网上看到不少关于word模板生成报表的例子,踩了不少的坑。最大的问题就是生成的word文档电脑...它是保存一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZI...

    踩过的坑

    在网上看到不少关于word模板生成报表的例子,踩了不少的坑。最大的问题就是生成的word文档在电脑打开显示正常,而用手机打开显示的是全是xml标签。

    本质

    docx格式的文档本质上是一个ZIP文件。docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。将.docx 格式的文件后缀改为ZIP后解压, 可以看到解压出来的文件夹中有word这样一个文件夹,它包含了Word文档的大部分内容。而其中的document.xml文件则包含了文档的主要文本内容。

    步骤

    第一步【新建文档】

    新建一个test.docx文档,内容如下。
    在这里插入图片描述

    第二步【zip目录文件说明】

    把test.docx的文档后缀改为zip。打开压缩文件我们主要进入word目录下,结构如下。
    media:存放word文档里面插入的图片。
    theme:主题样式。
    document.xml:文档主要内容。
    header1.xml:文档页眉内容。
    footer1.xml:文档页脚内容。

    在这里插入图片描述

    第三步【修改xml文件】

    例如我现在需要对文档主体内容进行修改。把document.xml文件内容剪切,进行代码格式化,再把格式化的内容粘贴回去。
    把我们的中文替换成FTL标签,参考如下链接。
    https://blog.csdn.net/asa_prince/article/details/82018446
    https://blog.csdn.net/asa_prince/article/details/82017976
    https://blog.csdn.net/qq_33616529/article/details/78291103
    https://blog.csdn.net/jayainuo/article/details/69220728
    https://www.cnblogs.com/zhaoYuQing-java2015/p/6046697.html
    例如表格可以删除掉李四这一行的内容,把张三这一行的内容循环遍历<#list userList! as user> </#list>,再把张三替换成${!user.name},其他属性类似操作。
    在这里插入图片描述

    第四步【执行代码】

    1. 生成word报表相关代码
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    
    public class WordUtils {
    	private static Logger LOGGER = LoggerFactory.getLogger(WordUtils.class);
    	/**
    	 * 往xml文件填充数据
    	 * @param dataMap 数据
    	 * @param templatePath 模板路径
    	 * @param templateName 模板名称
    	 * @param generatePath 生成的文件路径
    	 */
    	public static void process(Map<String,Object> dataMap,String templatePath,String templateName, String generatePath) {
    		Writer out = null;
    		try {
    			Configuration configuration = new Configuration(Configuration.getVersion());
    			configuration.setDefaultEncoding("utf-8");
    			configuration.setDirectoryForTemplateLoading(new File(templatePath));
    			Template t = configuration.getTemplate(templateName, "utf-8");
    			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(generatePath)), "utf-8"));
    			t.process(dataMap, out);
    		} catch (Exception e) {
    			LOGGER.error("往xml文件填充数据失败:{}",e.getMessage());
    		} finally {
    			close(out);
    		}
    	}
    
    	/**
    	 * 替换某个 item,
    	 * @param zipInputStreamPath  zip文件的zip输入流路径
    	 * @param zipOutputStreamPath 输出的zip输出流路径
    	 * @param itemInputStreamMap 要替换的 item 的内容输入流路径
    	 */
    	public static void replaceItem(String zipInputStreamPath, String zipOutputStreamPath, 
    			Map<String,String> itemInputStreamMap) {
    		ZipInputStream zipInputStream = null;
    		ZipOutputStream zipOutputStream = null;
    		try {
    			zipInputStream = new ZipInputStream(new FileInputStream(new File(zipInputStreamPath)));
    	        zipOutputStream = new ZipOutputStream(new FileOutputStream(new File(zipOutputStreamPath)));
    			ZipEntry entryIn;
    			int len = -1;
    			// 缓冲区
    			byte[] buf = new byte[8 * 1024];
    			while ((entryIn = zipInputStream.getNextEntry()) != null) {
    				String entryName = entryIn.getName();
    				ZipEntry entryOut = new ZipEntry(entryName);
    				// 只使用 name
    				zipOutputStream.putNextEntry(entryOut);
    				if(itemInputStreamMap.containsKey(entryName)) {
    					String path = itemInputStreamMap.get(entryName);
    					InputStream inputStream = new FileInputStream(new File(path));
    					// 使用替换流
    					while ((len = (inputStream.read(buf))) > 0) {
    						zipOutputStream.write(buf, 0, len);
    					}
    					close(inputStream);
    					itemInputStreamMap.remove(entryName);
    				}else {
    					// 输出普通Zip流
    					while ((len = (zipInputStream.read(buf))) > 0) {
    						zipOutputStream.write(buf, 0, len);
    					}
    				}
    			}
    			// 关闭此 entry
    			zipInputStream.closeEntry();
    			zipOutputStream.closeEntry();
    		} catch (IOException e) {
    			LOGGER.error("替换item失败:{}",e.getMessage());
    		} finally {
    			close(zipInputStream);
    			close(zipOutputStream);
    		}
    	}
    
    
    	private static void close(InputStream inputStream) {
    		if (null != inputStream) {
    			try {
    				inputStream.close();
    			} catch (IOException e) {
    				LOGGER.error(e.getMessage());
    			}
    		}
    	}
    
    	private static void close(OutputStream outputStream) {
    		if (null != outputStream) {
    			try {
    				outputStream.flush();
    				outputStream.close();
    			} catch (IOException e) {
    				LOGGER.error(e.getMessage());
    			}
    		}
    	}
    	
    	private static void close(Writer out) {
    		if (null != out) {
    			try {
    				out.flush();
    				out.close();
    			} catch (IOException e) {
    				LOGGER.error(e.getMessage());
    			}
    		}
    	}
    }
    
    
    
    
    1. 后台生成统计图表图片相关代码,需要安装phantomjs,引入相关的js。[无需生成统计图表可以忽略此代码]
      在这里插入图片描述
    import java.io.File;
    import java.io.FileOutputStream;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class EchartsUtils {
    	
    	private static final Logger LOG = LoggerFactory.getLogger(EchartsUtils.class);
    	
    	public static final String FILETYPE = ".js";
    	
    	public static final String IMGTYPE = ".png";
    	
    	public static final float SCALE = 0.25f;
    	
    	public static final int WIDTH = 800;
    	
    	public static final int HEIGHT = 400;
    	
    	
    	/**
    	 * 生成echarts图片
    	 * @param json 
    	 * @param rootPath 	生成的临时文件夹目录
    	 * @param name 		图片名称
    	 * @return
    	 * @throws Exception
    	 */
    	public static boolean getEchartsImg(String json,String upgradePath,String rootPath,String name){
    		boolean flag = true;
    		Process process = null;
    		try {
    			rootPath += name; 
    			 //生成js文件
    			writeEchartsJs(json,rootPath+FILETYPE);
    			//生成echarts图片
    			Runtime rt = Runtime.getRuntime();
    			process = rt.exec(
    					"phantomjs " + upgradePath + File.separator + ReportConst.PATH_ECHARTS + "echarts-convert.js -infile " + rootPath + FILETYPE + " -outfile " + rootPath + IMGTYPE + 
    					" -scale " + SCALE + " -width " + WIDTH + " -height" + HEIGHT
    					);
    			//等待图片生成
    		    process.waitFor();
    		} catch (Exception e) {
    			flag = false;
    			LOG.error("生成EchartsIMG失败:{}",e.getMessage());
    		}finally {
    			if(process != null) {
    				process.destroy();
    			}
    		}
    		return flag;
    	}
    
    	public static void writeEchartsJs(String json, String path) {
    		FileOutputStream outSTr = null;
    		try {
    			File file = new File(path);
    			outSTr = new FileOutputStream(file);
    			outSTr.write(json.getBytes());
    		} catch (Exception e) {
    			LOG.error("生成EchartsJS文件失败:{}",e.getMessage());
    		} finally {
    			FileUtils.close(outSTr);
    		}
    	}
    }
    
    
    	@Test
    	public void generateWord() {
            Map<String, Object> dataMap = new HashMap<String, Object>();
            dataMap.put("title", "XXX报表");
    		List<Map<String, Object>> list = new ArrayList<>();
    		for (int i = 1; i <= 50; i++) {
    			Map<String, Object> map = new HashMap<String, Object>();
    			dataMap.put("name", "张三"+i);
    			dataMap.put("sex", "男");
    			dataMap.put("age", i);
    			list.add(map);
    		}
    		dataMap.put("userList", list);
    		
        	String json = getPieOption();
            boolean flag = EchartsUtils.getEchartsImg(json, "",IMGURL, "test_pie");
            if(flag) {
            	WordUtils.process(dataMap, PATH, "test_document.xml", PATH+"data.xml");
                Map<String, String> itemInputStreamMap = new HashMap<>();
                itemInputStreamMap.put("word/document.xml", PATH+"data.xml");
                itemInputStreamMap.put("word/media/image1.png", IMGURL+"test_pie.png");
                WordUtils.replaceItem(PATH+"test.zip", PATH+"test_generate.docx", itemInputStreamMap );
            }
        }
    
    展开全文
  • C# WORD操作实现代码

    2020-12-31 04:20:11
    定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案...
  • C# 操作WORD

    2009-04-15 09:56:00
    定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能


      在当前项目开发过程中,客户有根据数据库数据生成WORD文档的需求,在和同事沟通的过程中,找到了两个解决方案:
     1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。
     2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档。
      第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案。第二方案比较复杂,需要调用OFFICE的WORD组件通过C#来操作WORD,进而生成WORD。此方法类似于我们在c#中的后台拼接数据。虽然麻烦,但是能够灵活定制,只不过是操作WORD对象而已。
      经过再三考虑:决定用第二种方法来生成WORD报告文档。
      通过自己的实践,这个需求总算是搞定了,在实际开发的过程中,遇到了这样那样的问题,还好,通过不断的查找网络资源,结合实际开发中的情况,问题都得到了解决。现将本人在开发过程中的一些理解与经验总结一下:
      在VS2008平台下,引用.net-Microsoft.Office.Interop.Word.12,这样就可以在程序用操作WORD对象了。
      通过简单执行,报了80070005错误,这个错误是因为权限不够,需要在DCOM配置中更改.net和IIS用户的操作权限,具体修改过程如下:       解决方法一:
         1.控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》找到Microsoft Word文档之后,单击属性打开此应  用程序的属性对话框。 
         2.单击标识选项卡,然后选择交互式用户。
         3.单击"安全"选项卡,分别在"启动和激活权限"和"访问权限"组中选中"自定义",然后自定义->编辑->添加ASP.NET账户和IUSER_计算机  名。
         4. 确保允许每个用户访问,然后单击确定。
         5. 单击确定关闭 DCOMCNFG。

         如果上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法:
     在web.config中使用身份模拟,在<system.web>节中加入  <identity impersonate="true" userName="你的用户名 " password="密码 "/>
          </system.web>
      解决了上述问题,开始考虑如何创建WORD模板文件,WORD的模板文件其实就是通过书签来添加内容的。也就是通过在WORD文档中创建书签,然后在程序中获取模板文件的所有书签,通过给书签赋值来进行文档生成的。
      在程序中的操作流程如下:
     声明WORD程序的对象 → 声明一个WORD文档对象 → 获取当前的操作文档对象 → 获取文档所有的书签 → 将数据库数据赋值到对应的书签 → 将文档另存为指定的文件夹下.
      下面将针对农业植物测试报告来分析具体的代码实现:
      

      上述代码就是一个通过模板文件生成WORD的过程。其实也就是一个替换书签内容的过程。
      在开发的过程中,有些数据是动态增加的,假如我要向一个表格中动态的添加几行数据,就无法用替换书签的方式来进行操作,需要通过程序在文档页面的表格中添加行。
      向表格中添加行,有两种操作形式:一种是在WORD模板中已经存在了一个表格。一种是我们在程序中直接添加一个表格对象。
      第一种情况下,需要注意:在WORD模板中要操作的表格中,不能有纵向合并的单元格,不然程序无法获取到当前要操作对象导致程序报错.单元格的合并,我们可以在程序中控制。
      第二种情况下就需要我们通过程序去直接添加表格了。
      生成表格的代码具体如下:
       1.获取文档中已存在的表格:
     Microsoft.Office.Interop.Word.Table characterTable = doc.Tables[2];//在document对象的集合操作中,起始点是从1开始,并不是从0开始的,此处需要注意。
     2.在文档中直接生成表格,首先要获取插入表格的位置,然后添加表格对象:
     object oEndOfDoc = "//endofdoc";//WORD中预定义的书签,还有很多,此处就不一一列举。
     object oMissing = System.Reflection.Missing.Value;
            Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;//获取当前文档的末尾位置。
            wrdRng.InsertAfter(" ");//插入一行,此处不能用 wrdRng.InsertAfter(""),如果用这个,就不能换行,我也不知道为什么。
     object oCollapseEnd = Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd;
            object oPageBreak = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;//分页符
            wrdRng.Collapse(ref oCollapseEnd);
            wrdRng.InsertBreak(ref oPageBreak);//插入了一页
            wrdRng.Collapse(ref oCollapseEnd);
            wrdRng.InsertAfter("图片信息");
            wrdRng.Font.Size = 20;//指定操作对象的文字大小
            wrdRng.Font.Bold = 1;//指定操作对象的粗体:1为粗体,0为正常
            wrdRng.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;//指定操作区域的文字布局:居中对齐
     //上述代码的意思是:找到当前的末尾位置,然后插入一个分页符,相当于跳到了一个新页,在这个新页的顶端写入文字“图片信息”,并指定文字大小为20,粗体居中显示。
     wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
            wrdRng.InsertAfter(" ");
            wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
            wrdRng.InsertParagraphAfter();//插入一个段落,在此段落上插入一个2行一列的表格。
            Microsoft.Office.Interop.Word.Table newTable = doc.Tables.Add(wrdRng, 2, 1, ref oMissing, ref oMissing);
     我们还可以对表格进行格式设置,此处我们就不在一一列举。
     3.下面我们分析一下对表格的单元格的操作:合并,拆分。这个就需要我们根据实际表格来进行操作:
     //获取具体的某个单元格(1,1),获取第一行第一列的单元格
     Cell cell = doc.Tables[1].Cell(1,1);
     cell.Range.Text="Text";//指定当前单元格的内容为Text
     在Table的操作中,添加新行:
     object beforeRow = doc.Tables[1].Rows[2];//此行是先获取到第二行
     doc.Tables[1].Rows.Add(ref beforeRow);//效果类似于在WORD中此表格的第二行上进行【插入行】操作,插入的新行将会插入到当前行的上一行中,格式也是和此行一致的。
     //合并单元格:感觉在此处合并单元格挺傻瓜的,你只需要指定你要合并的起始单元格和结束单元格,然后通过Merge操作就行了
     Cell cell = doc.Tables[1].Cell(iRow, 2);//列合并
            cell.Merge(doc.Tables[1].Cell(iRow, 6));
            Cell cell1 = doc.Tables[1].Cell(iRow - 1, 1);//行合并
            cell1.Merge(doc.Tables[1].Cell(iRow + 1, 1));
    上述操作就是在此程序中用到的一些知识点,还有好多的东西需要去熟悉、理解。
       另外,在程序的测试过程中发现,当执行一次文档生成后,在资源管理器中始终有winword.exe进程杀不掉,目前的解决办法是:直接杀进程,代码如下:
        protected void killAllProcess() // 杀掉所有winword.exe进程
        {
            System.Diagnostics.Process[] myPs;
            myPs = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in myPs)
            {
                if (p.Id != 0)
                {
                    string myS = "WINWORD.EXE" + p.ProcessName + "  ID:" + p.Id.ToString();
                    try
                    {
                        if (p.Modules != null)
                            if (p.Modules.Count > 0)
                            {
                                System.Diagnostics.ProcessModule pm = p.Modules[0];
                                myS += "/n Modules[0].FileName:" + pm.FileName;
                                myS += "/n Modules[0].ModuleName:" + pm.ModuleName;
                                myS += "/n Modules[0].FileVersionInfo:/n" + pm.FileVersionInfo.ToString();
                                if (pm.ModuleName.ToLower() == "winword.exe")
                                    p.Kill();
                            }
                    }
                    catch
                    { }
                    finally
                    {
                        ;
                    }
                }
            }
        }
    目前为止,一个WORD文档就生成了。上述为我在这个程序开发中遇到的问题和解决方法,可能有好多地方都是考虑不全的,如果在程序开发中对WORD的操作有新的认识的话,欢迎和我沟通交流,彼此提高!
    下边是在网上一些比较好的摘抄:
     创建新Word
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);

    打开文档:
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                object fileName = @"E:CCCXCXXTestDoc.doc";
                oDoc = oWord.Documents.Open(ref fileName,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

    导入模板
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                object fileName = @"E:XXXCCXTest.doc";
                oDoc = oWord.Documents.Add(ref fileName, ref oMissing,
                                ref oMissing, ref oMissing);


    .添加新表
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);

                object start = 0;
                object end = 0;
                Word.Range tableLocation = oDoc.Range(ref start, ref end);
                oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);

    .表插入行
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);

                object start = 0;
                object end = 0;
                Word.Range tableLocation = oDoc.Range(ref start, ref end);
                oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);

                Word.Table newTable = oDoc.Tables[1];
                object beforeRow = newTable.Rows[1];
                newTable.Rows.Add(ref beforeRow);

    .单元格合并
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);

                object start = 0;
                object end = 0;
                Word.Range tableLocation = oDoc.Range(ref start, ref end);
                oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);

                Word.Table newTable = oDoc.Tables[1];
                object beforeRow = newTable.Rows[1];
                newTable.Rows.Add(ref beforeRow);

                Word.Cell cell = newTable.Cell(1, 1);
                cell.Merge(newTable.Cell(1, 2));

    .单元格分离
                object oMissing = System.Reflection.Missing.Value;
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add( oMissing,
                    ref oMissing, ref oMissing);

                object start = 0;
                object end = 0;
                Word.Range tableLocation = oDoc.Range(ref start, ref end);
                oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);

                Word.Table newTable = oDoc.Tables[1];
                object beforeRow = newTable.Rows[1];
                newTable.Rows.Add(ref beforeRow);

                Word.Cell cell = newTable.Cell(1, 1);
                cell.Merge(newTable.Cell(1, 2));

                object Rownum = 2;
                object Columnnum = 2;
                cell.Split(ref Rownum, ref Columnnum);

    通过段落控制插入
                object oMissing = System.Reflection.Missing.Value;
                object oEndOfDoc = "/endofdoc"; /**//* endofdoc is a predefined bookmark */

                //Start Word and create a new document.
                Word._Application oWord;
                Word._Document oDoc;
                oWord = new Word.Application();
                oWord.Visible = true;
                oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);

                //Insert a paragraph at the beginning of the document.
                Word.Paragraph oPara1;
                oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
                oPara1.Range.Text = "Heading 1";
                oPara1.Range.Font.Bold = 1;
                oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.
                oPara1.Range.InsertParagraphAfter();

    展开全文
  • 当前项目开发过程,...定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说...

    在当前项目开发过程中,客户有根据数据库数据生成WORD文档的需求,在和同事沟通的过程中,找到了两个解决方案

    1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。 2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案。第二方案比较复杂,需要调用OFFICE的WORD组件通过C#来操作WORD,进而生成WORD。此方法类似于我们在c#中的后台拼接数据。虽然麻烦,但是能够灵活定制,只不过是操作WORD对象而已。 经过再三考虑:决定用第二种方法来生成WORD报告文档。 通过自己的实践,这个需求总算是搞定了,在实际开发的过程中,遇到了这样那样的问题,还好,通过不断的查找网络资源,结合实际开发中的情况,问题都得到了解决。

    现将本人在开发过程中的一些理解与经验总结一下: 在VS2008平台下,引用.net-Microsoft.Office.Interop.Word.12,这样就可以在程序用操作WORD对象了。 通过简单执行,报了80070005错误,这个错误是因为权限不够,需要在DCOM配置中更改.net和IIS用户的操作权限,具体修改过程如下: 解决方法一: 1.控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》找到Microsoft Word文档之后,单击属性打开此应 用程序的属性对话框。 2.单击标识选项卡,然后选择交互式用户。 3.单击"安全"选项卡,分别在"启动和激活权限"和"访问权限"组中选中"自定义",然后自定义->编辑->添加ASP.NET账户和IUSER_计算机 名。 4. 确保允许每个用户访问,然后单击确定。 5. 单击确定关闭 DCOMCNFG。 如果上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法: 在web.config中使用身份模拟,在<system.web>节中加入 <identity impersonate="true" userName="你的用户名 " password="密码 "/> </system.web> 解决了上述问题,开始考虑如何创建WORD模板文件,WORD的模板文件其实就是通过书签来添加内容的。也就是通过在WORD文档中创建书签,然后在程序中获取模板文件的所有书签,通过给书签赋值来进行文档生成的。 在程序中的操作流程如下: 声明WORD程序的对象 → 声明一个WORD文档对象 → 获取当前的操作文档对象 → 获取文档所有的书签 → 将数据库数据赋值到对应的书签 → 将文档另存为指定的文件夹下.

    下面将针对农业植物测试报告来分析具体的代码实现:

    复制代码 代码如下:

     

    //生成WORD程序对象和WORD文档对象 
    Microsoft.Office.Interop.Word.Application appWord = new Application(); 
    Microsoft.Office.Interop.Word.Document doc = new Document(); 
    object oMissing = System.Reflection.Missing.Value;//这个是什么东西,我始终没搞明白-_- 
    //打开模板文档,并指定doc的文档类型 
    object objTemplate = Server.MapPath(p_TemplatePath); 
    object objDocType = WdDocumentType.wdTypeDocument; 
    doc = (Document)appWord.Documents.Add(ref objTemplate, ref objFalse, ref objDocType, ref objTrue); 
    //获取模板中所有的书签 
    Bookmarks odf = doc.Bookmarks; 
    string[] testTableremarks = { "ApplyNo", "AuditingDate", "Auditor", "CheckDate", "Checker"}; 
    string[] testTablevalues = { "ApplyNo", "AuditingDate", "Auditor", "CheckDate", "Checker",}; 
    //循环所有的书签,并给书签赋值 
    for (int oIndex = 0; oIndex < testTableremarks.Length; oIndex++) 
    { 
    obDD_Name = WD + testTableremarks[oIndex]; 
    doc.Bookmarks.get_Item(ref obDD_Name).Range.Text = p_TestReportTable.Rows[0][testTablevalues [oIndex]].ToString();//此处Range也是WORD中很重要的一个对象,就是当前操作参数所在的区域 
    } 
    //第四步 生成word,将当前的文档对象另存为指定的路径,然后关闭doc对象。关闭应用程序 
    object filename = Server.MapPath(p_SavePath) + "\\Testing_" + DateTime.Now.ToShortDateString() + ".doc"; 
    object miss = System.Reflection.Missing.Value; 
    doc.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss); 
    object missingValue = Type.Missing; 
    object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges; 
    doc.Close(ref doNotSaveChanges, ref missingValue, ref missingValue); 
    appWord.Application.Quit(ref miss, ref miss, ref miss); 
    doc = null; 
    appWord = null; 
    this.Hid_ShowMessage.Value = "生成成功!";

    上述代码就是一个通过模板文件生成WORD的过程。其实也就是一个替换书签内容的过程。 在开发的过程中,有些数据是动态增加的,假如我要向一个表格中动态的添加几行数据,就无法用替换书签的方式来进行操作,需要通过程序在文档页面的表格中添加行。 向表格中添加行,有两种操作形式:一种是在WORD模板中已经存在了一个表格。一种是我们在程序中直接添加一个表格对象。 第一种情况下,需要注意:在WORD模板中要操作的表格中,不能有纵向合并的单元格,不然程序无法获取到当前要操作对象导致程序报错.单元格的合并,我们可以在程序中控制。 第二种情况下就需要我们通过程序去直接添加表格了。 生成表格的代码具体如下: 1.获取文档中已存在的表格: Microsoft.Office.Interop.Word.Table characterTable = doc.Tables[2];//在document对象的集合操作中,起始点是从1开始,并不是从0开始的,此处需要注意。 2.在文档中直接生成表格,首先要获取插入表格的位置,然后添加表格对象: object oEndOfDoc = "\\endofdoc";//WORD中预定义的书签,还有很多,此处就不一一列举。 object oMissing = System.Reflection.Missing.Value; Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;//获取当前文档的末尾位置。 wrdRng.InsertAfter(" ");//插入一行,此处不能用 wrdRng.InsertAfter(""),如果用这个,就不能换行,我也不知道为什么。

    object oCollapseEnd = Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd; 
    object oPageBreak = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;//分页符 
    wrdRng.Collapse(ref oCollapseEnd); 
    wrdRng.InsertBreak(ref oPageBreak);//插入了一页 
    wrdRng.Collapse(ref oCollapseEnd); 
    wrdRng.InsertAfter("图片信息"); 
    wrdRng.Font.Size = 20;//指定操作对象的文字大小 
    wrdRng.Font.Bold = 1;//指定操作对象的粗体:1为粗体,0为正常 
    wrdRng.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;//指定操作区域的文字布局:居中对齐 
    //上述代码的意思是:找到当前的末尾位置,然后插入一个分页符,相当于跳到了一个新页,在这个新页的顶端写入文字“图片信息”,并指定文字大小为20,粗体居中显示。 
    wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range; 
    wrdRng.InsertAfter(" "); 
    wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range; 
    wrdRng.InsertParagraphAfter();//插入一个段落,在此段落上插入一个2行一列的表格。 
    Microsoft.Office.Interop.Word.Table newTable = doc.Tables.Add(wrdRng, 2, 1, ref oMissing, ref oMissing); 

    我们还可以对表格进行格式设置,此处我们就不在一一列举。 3.下面我们分析一下对表格的单元格的操作:合并,拆分。这个就需要我们根据实际表格来进行操作: //获取具体的某个单元格(1,1),获取第一行第一列的单元格 Cell cell = doc.Tables[1].Cell(1,1); cell.Range.Text="Text";//指定当前单元格的内容为Text 在Table的操作中,添加新行: object beforeRow = doc.Tables[1].Rows[2];//此行是先获取到第二行 doc.Tables[1].Rows.Add(ref beforeRow);//效果类似于在WORD中此表格的第二行上进行【插入行】操作,插入的新行将会插入到当前行的上一行中,格式也是和此行一致的。 //合并单元格:感觉在此处合并单元格挺傻瓜的,你只需要指定你要合并的起始单元格和结束单元格,然后通过Merge操作就行了 Cell cell = doc.Tables[1].Cell(iRow, 2);//列合并 cell.Merge(doc.Tables[1].Cell(iRow, 6)); Cell cell1 = doc.Tables[1].Cell(iRow - 1, 1);//行合并 cell1.Merge(doc.Tables[1].Cell(iRow + 1, 1)); 上述操作就是在此程序中用到的一些知识点,还有好多的东西需要去熟悉、理解。 另外,在程序的测试过程中发现,当执行一次文档生成后,在资源管理器中始终有winword.exe进程杀不掉,目前的解决办法是:直接杀进程,代码如下:

    protected void killAllProcess() // 杀掉所有winword.exe进程 
    { 
    System.Diagnostics.Process[] myPs; 
    myPs = System.Diagnostics.Process.GetProcesses(); 
    foreach (System.Diagnostics.Process p in myPs) 
    { 
    if (p.Id != 0) 
    { 
    string myS = "WINWORD.EXE" + p.ProcessName + " ID:" + p.Id.ToString(); 
    try 
    { 
    if (p.Modules != null) 
    if (p.Modules.Count > 0) 
    { 
    System.Diagnostics.ProcessModule pm = p.Modules[0]; 
    myS += "\n Modules[0].FileName:" + pm.FileName; 
    myS += "\n Modules[0].ModuleName:" + pm.ModuleName; 
    myS += "\n Modules[0].FileVersionInfo:\n" + pm.FileVersionInfo.ToString(); 
    if (pm.ModuleName.ToLower() == "winword.exe") 
    p.Kill(); 
    } 
    } 
    catch 
    { } 
    finally 
    { 
    
    } 
    } 
    } 
    } 

    目前为止,一个WORD文档就生成了。上述为我在这个程序开发中遇到的问题和解决方法,可能有好多地方都是考虑不全的,如果在程序开发中对WORD的操作有新的认识的话,欢迎和我沟通交流,彼此提高! 下边是在网上一些比较好的摘抄: 创建新Word

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing); 

    打开文档:

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    object fileName = @"E:CCCXCXXTestDoc.doc"; 
    oDoc = oWord.Documents.Open(ref fileName, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); 

    导入模板

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    object fileName = @"E:XXXCCXTest.doc"; 
    oDoc = oWord.Documents.Add(ref fileName, ref oMissing, 
    ref oMissing, ref oMissing); 

    添加新表

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing); 
    object start = 0; 
    object end = 0; 
    Word.Range tableLocation = oDoc.Range(ref start, ref end); 
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing); 

    表插入行

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing); 
    object start = 0; 
    object end = 0; 
    Word.Range tableLocation = oDoc.Range(ref start, ref end); 
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing); 
    Word.Table newTable = oDoc.Tables[1]; 
    object beforeRow = newTable.Rows[1]; 
    newTable.Rows.Add(ref beforeRow); 

    单元格合并

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing); 
    object start = 0; 
    object end = 0; 
    Word.Range tableLocation = oDoc.Range(ref start, ref end); 
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing); 
    Word.Table newTable = oDoc.Tables[1]; 
    object beforeRow = newTable.Rows[1]; 
    newTable.Rows.Add(ref beforeRow); 
    Word.Cell cell = newTable.Cell(1, 1); 
    cell.Merge(newTable.Cell(1, 2)); 

    单元格分离

    object oMissing = System.Reflection.Missing.Value; 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add( oMissing, 
    ref oMissing, ref oMissing); 
    object start = 0; 
    object end = 0; 
    Word.Range tableLocation = oDoc.Range(ref start, ref end); 
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing); 
    Word.Table newTable = oDoc.Tables[1]; 
    object beforeRow = newTable.Rows[1]; 
    newTable.Rows.Add(ref beforeRow); 
    Word.Cell cell = newTable.Cell(1, 1); 
    cell.Merge(newTable.Cell(1, 2)); 
    object Rownum = 2; 
    object Columnnum = 2; 
    cell.Split(ref Rownum, ref Columnnum); 

    通过段落控制插入

    object oMissing = System.Reflection.Missing.Value; 
    object oEndOfDoc = "\endofdoc"; /**//* endofdoc is a predefined bookmark */ 
    //Start Word and create a new document. 
    Word._Application oWord; 
    Word._Document oDoc; 
    oWord = new Word.Application(); 
    oWord.Visible = true; 
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, 
    ref oMissing, ref oMissing); 
    //Insert a paragraph at the beginning of the document. 
    Word.Paragraph oPara1; 
    oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing); 
    oPara1.Range.Text = "Heading 1"; 
    oPara1.Range.Font.Bold = 1; 
    oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph. 
    oPara1.Range.InsertParagraphAfter(); 

     

    转载于:https://www.cnblogs.com/hfzsjz/p/3146213.html

    展开全文
  • C#操作Word

    2010-10-17 22:33:00
    定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第 一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过...

    1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。
    2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档。
    第 一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案。第二 方案比较复杂,需要调用OFFICE的WORD组件通过C#来操作WORD,进而生成WORD。此方法类似于我们在c#中的后台拼接数据。虽然麻烦,但是 能够灵活定制,只不过是操作WORD对象而已。
    经过再三考虑:决定用第二种方法来生成WORD报告文档。
    通过自己的实践,这个需求总算是搞定了,在实际开发的过程中,遇到了这样那样的问题,还好,通过不断的查找网络资源,结合实际开发中的情况,问题都得到了解决。现将本人在开发过程中的一些理解与经验总结一下:
    在VS2008平台下,引用.net-Microsoft.Office.Interop.Word.12,这样就可以在程序用操作WORD对象了。
    通过简单执行,报了80070005错误,这个错误是因为权限不够,需要在DCOM配置中更改.net和IIS用户的操作权限,具体修改过程如下: 解决方法一:
    1.控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》找到Microsoft Word文档之后,单击属性打开此应 用程序的属性对话框。
    2.单击标识选项卡,然后选择交互式用户。
    3.单击"安全"选项卡,分别在"启动和激活权限"和"访问权限"组中选中"自定义",然后自定义->编辑->添加ASP.NET账户和IUSER_计算机 名。
    4. 确保允许每个用户访问,然后单击确定。
    5. 单击确定关闭 DCOMCNFG。
    如果上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法:
    在web.config中使用身份模拟,在<system.web>节中加入 <identity impersonate="true" userName="你的用户名 " password="密码 "/>
    </system.web>
    解决了上述问题,开始考虑如何创建WORD模板文件,WORD的模板文件其实就是通过书签来添加内容的。也就是通过在WORD文档中创建书签,然后在程序中获取模板文件的所有书签,通过给书签赋值来进行文档生成的。
    在程序中的操作流程如下:
    声明WORD程序的对象 → 声明一个WORD文档对象 → 获取当前的操作文档对象 → 获取文档所有的书签 → 将数据库数据赋值到对应的书签 → 将文档另存为指定的文件夹下.
    下面将针对农业植物测试报告来分析具体的代码实现:

    复制代码 代码如下:

    //生成WORD程序对象和WORD文档对象
    Microsoft.Office.Interop.Word.Application appWord = new Application();
    Microsoft.Office.Interop.Word.Document doc = new Document();
    object oMissing = System.Reflection.Missing.Value;//这个是什么东西,我始终没搞明白-_-
    //打开模板文档,并指定doc的文档类型
    object objTemplate = Server.MapPath(p_TemplatePath);
    object objDocType = WdDocumentType.wdTypeDocument;
    doc = (Document)appWord.Documents.Add(ref objTemplate, ref objFalse, ref objDocType, ref objTrue);
    //获取模板中所有的书签
    Bookmarks odf = doc.Bookmarks;
    string[] testTableremarks = { "ApplyNo", "AuditingDate", "Auditor", "CheckDate", "Checker"};
    string[] testTablevalues = { "ApplyNo", "AuditingDate", "Auditor", "CheckDate", "Checker",};
    //循环所有的书签,并给书签赋值
    for (int oIndex = 0; oIndex < testTableremarks.Length; oIndex++)
    {
    obDD_Name = WD + testTableremarks[oIndex];
    doc.Bookmarks.get_Item(ref obDD_Name).Range.Text = p_TestReportTable.Rows[0][testTablevalues [oIndex]].ToString();//此处Range也是WORD中很重要的一个对象,就是当前操作参数所在的区域
    }
    //第四步 生成word,将当前的文档对象另存为指定的路径,然后关闭doc对象。关闭应用程序
    object filename = Server.MapPath(p_SavePath) + "//Testing_" + DateTime.Now.ToShortDateString() + ".doc";
    object miss = System.Reflection.Missing.Value;
    doc.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
    object missingValue = Type.Missing;
    object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
    doc.Close(ref doNotSaveChanges, ref missingValue, ref missingValue);
    appWord.Application.Quit(ref miss, ref miss, ref miss);
    doc = null;
    appWord = null;
    this.Hid_ShowMessage.Value = "生成成功!";


    上述代码就是一个通过模板文件生成WORD的过程。其实也就是一个替换书签内容的过程。
    在开发的过程中,有些数据是动态增加的,假如我要向一个表格中动态的添加几行数据,就无法用替换书签的方式来进行操作,需要通过程序在文档页面的表格中添加行。
    向表格中添加行,有两种操作形式:一种是在WORD模板中已经存在了一个表格。一种是我们在程序中直接添加一个表格对象。
    第一种情况下,需要注意:在WORD模板中要操作的表格中,不能有纵向合并的单元格,不然程序无法获取到当前要操作对象导致程序报错.单元格的合并,我们可以在程序中控制。
    第二种情况下就需要我们通过程序去直接添加表格了。
    生成表格的代码具体如下:
    1.获取文档中已存在的表格:
    Microsoft.Office.Interop.Word.Table characterTable = doc.Tables[2];//在document对象的集合操作中,起始点是从1开始,并不是从0开始的,此处需要注意。
    2.在文档中直接生成表格,首先要获取插入表格的位置,然后添加表格对象:
    object oEndOfDoc = "//endofdoc";//WORD中预定义的书签,还有很多,此处就不一一列举。
    object oMissing = System.Reflection.Missing.Value;
    Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;//获取当前文档的末尾位置。
    wrdRng.InsertAfter(" ");//插入一行,此处不能用 wrdRng.InsertAfter(""),如果用这个,就不能换行,我也不知道为什么。

    复制代码 代码如下:

    object oCollapseEnd = Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd;
    object oPageBreak = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;//分页符
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertBreak(ref oPageBreak);//插入了一页
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertAfter("图片信息");
    wrdRng.Font.Size = 20;//指定操作对象的文字大小
    wrdRng.Font.Bold = 1;//指定操作对象的粗体:1为粗体,0为正常
    wrdRng.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;//指定操作区域的文字布局:居中对齐
    //上述代码的意思是:找到当前的末尾位置,然后插入一个分页符,相当于跳到了一个新页,在这个新页的顶端写入文字“图片信息”,并指定文字大小为20,粗体居中显示。
    wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.InsertAfter(" ");
    wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.InsertParagraphAfter();//插入一个段落,在此段落上插入一个2行一列的表格。
    Microsoft.Office.Interop.Word.Table newTable = doc.Tables.Add(wrdRng, 2, 1, ref oMissing, ref oMissing);


    我们还可以对表格进行格式设置,此处我们就不在一一列举。
    3.下面我们分析一下对表格的单元格的操作:合并,拆分。这个就需要我们根据实际表格来进行操作:
    //获取具体的某个单元格(1,1),获取第一行第一列的单元格
    Cell cell = doc.Tables[1].Cell(1,1);
    cell.Range.Text="Text";//指定当前单元格的内容为Text
    在Table的操作中,添加新行:
    object beforeRow = doc.Tables[1].Rows[2];//此行是先获取到第二行
    doc.Tables[1].Rows.Add(ref beforeRow);//效果类似于在WORD中此表格的第二行上进行【插入行】操作,插入的新行将会插入到当前行的上一行中,格式也是和此行一致的。
    //合并单元格:感觉在此处合并单元格挺傻瓜的,你只需要指定你要合并的起始单元格和结束单元格,然后通过Merge操作就行了
    Cell cell = doc.Tables[1].Cell(iRow, 2);//列合并
    cell.Merge(doc.Tables[1].Cell(iRow, 6));
    Cell cell1 = doc.Tables[1].Cell(iRow - 1, 1);//行合并
    cell1.Merge(doc.Tables[1].Cell(iRow + 1, 1));
    上述操作就是在此程序中用到的一些知识点,还有好多的东西需要去熟悉、理解。
    另外,在程序的测试过程中发现,当执行一次文档生成后,在资源管理器中始终有winword.exe进程杀不掉,目前的解决办法是:直接杀进程,代码如下:

    复制代码 代码如下:

    protected void killAllProcess() // 杀掉所有winword.exe进程
    {
    System.Diagnostics.Process[] myPs;
    myPs = System.Diagnostics.Process.GetProcesses();
    foreach (System.Diagnostics.Process p in myPs)
    {
    if (p.Id != 0)
    {
    string myS = "WINWORD.EXE" + p.ProcessName + " ID:" + p.Id.ToString();
    try
    {
    if (p.Modules != null)
    if (p.Modules.Count > 0)
    {
    System.Diagnostics.ProcessModule pm = p.Modules[0];
    myS += "/n Modules[0].FileName:" + pm.FileName;
    myS += "/n Modules[0].ModuleName:" + pm.ModuleName;
    myS += "/n Modules[0].FileVersionInfo:/n" + pm.FileVersionInfo.ToString();
    if (pm.ModuleName.ToLower() == "winword.exe")
    p.Kill();
    }
    }
    catch
    { }
    finally
    {
    }
    }
    }
    }


    目前为止,一个WORD文档就生成了。上述为我在这个程序开发中遇到的问题和解决方法,可能有好多地方都是考虑不全的,如果在程序开发中对WORD的操作有新的认识的话,欢迎和我沟通交流,彼此提高!
    下边是在网上一些比较好的摘抄:
    创建新Word

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);


    打开文档:

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    object fileName = @"E:CCCXCXXTestDoc.doc";
    oDoc = oWord.Documents.Open(ref fileName,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);


    导入模板

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    object fileName = @"E:XXXCCXTest.doc";
    oDoc = oWord.Documents.Add(ref fileName, ref oMissing,
    ref oMissing, ref oMissing);


    .添加新表

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    object start = 0;
    object end = 0;
    Word.Range tableLocation = oDoc.Range(ref start, ref end);
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);


    .表插入行

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    object start = 0;
    object end = 0;
    Word.Range tableLocation = oDoc.Range(ref start, ref end);
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);
    Word.Table newTable = oDoc.Tables[1];
    object beforeRow = newTable.Rows[1];
    newTable.Rows.Add(ref beforeRow);


    .单元格合并

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    object start = 0;
    object end = 0;
    Word.Range tableLocation = oDoc.Range(ref start, ref end);
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);
    Word.Table newTable = oDoc.Tables[1];
    object beforeRow = newTable.Rows[1];
    newTable.Rows.Add(ref beforeRow);
    Word.Cell cell = newTable.Cell(1, 1);
    cell.Merge(newTable.Cell(1, 2));


    .单元格分离

    复制代码 代码如下:

    object oMissing = System.Reflection.Missing.Value;
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add( oMissing,
    ref oMissing, ref oMissing);
    object start = 0;
    object end = 0;
    Word.Range tableLocation = oDoc.Range(ref start, ref end);
    oDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing);
    Word.Table newTable = oDoc.Tables[1];
    object beforeRow = newTable.Rows[1];
    newTable.Rows.Add(ref beforeRow);
    Word.Cell cell = newTable.Cell(1, 1);
    cell.Merge(newTable.Cell(1, 2));
    object Rownum = 2;
    object Columnnum = 2;
    cell.Split(ref Rownum, ref Columnnum);


    通过段落控制插入

    复制代码 代码如下:


    object oMissing = System.Reflection.Missing.Value;
    object oEndOfDoc = "/endofdoc"; /**//* endofdoc is a predefined bookmark */
    //Start Word and create a new document.
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    //Insert a paragraph at the beginning of the document.
    Word.Paragraph oPara1;
    oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
    oPara1.Range.Text = "Heading 1";
    oPara1.Range.Font.Bold = 1;
    oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph.
    oPara1.Range.InsertParagraphAfter();

    展开全文
  • C#操作word -转载

    2014-01-18 16:31:00
    挺有借鉴性的拿过来给大家分享 ...定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样...
  • c# 操作word

    2009-07-08 11:10:00
    当前项目开发过程,客户有根据...定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样...
  • 2.定制WORD文档的模板文件C#操作WORD模板,生成新的WORD文档。第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案...
  • 需求说明 继上次进行分页查询后,需要将这些查询出来的数据导出成word和Excel。 导出word的方式有很多种,...将word的样式排版好后,将word另存xml格式,之后将该文件扩展名改成ftl格式,放置项目的ftl文件夹...
  • 从官网上下了LightSwitch_Office_Integration_...将文件复制到LS的客户端工程,并设内嵌的资源。 LS客户端需要导出WORD的地方,加一个命令按钮,生成相应的事件处理: partial void GenerateDocument_Exec...
  • 用 Python 自动生成 Word 文档

    万次阅读 多人点赞 2018-08-14 15:59:51
    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,...注:本库仅支持生成Word2007以后版本的文档类型,即扩展名为.doc...
  • 注:本库仅支持生成Word2007以后版本的文档类型,即扩展名为.docx 的。 下面分步介绍其基本使用方法: 步骤一: from docx import Document doc = Document() #以默认模板建立文档对象 doc = Document('a.d
  • 33.允许/禁止的上传扩展名设定,编辑、查看、播放的扩展名设定功能。 34.注册审核、邮件验证、防重复IP注册、时长注册功能。 35.来访IP限制设定和管理员可登录的IP设定。 36.可开启前台用户单点登录限制,同一...
  • 对于模板制作人员来说,Jxcms用户体验非常友好,打开模板文件就能看到完美的模板界面(非独立模板需要把head和foot还原到相应的文件),非常适合于建设一般企业、政府、学校、个人等小型网站。 精迅 2.1 升级...
  • Easy New File是一个用于Finder的... 支持所有常见文件扩展名,如文本文件,word文档,excel,keynote,richText文档等 支持添加自定义的文件模板。随心所欲更加方便 应用截图 激活方法 直接安装 问题:什么
  • 将生成的xml文件扩展名ftl,以此作为模板。4.java程序加载模板生成word文档。 freemaker可以方便实现“前后端分离”,既可以生成网页,也可以导出为word,尤其是针对那些格式样式比较复杂的文档,可以先...
  • 这是junit测试单元类我就不提交了,main()方法有几个小测试,有兴趣自己玩吧. 这个工具类目前主要有25种正规表达式(有些不常用,但那时才仔细深入的研究了一下正规,写上瘾了,就当时能想到的都写了): 1....
  • Python核心编程第二版(中文)

    热门讨论 2015-04-23 16:40:13
    目录 ······ 第1部分 Python核心 ...15.3.5 search()一个字符串查找一个模式(搜索与匹配的比较) 15.3.6 匹配多个字符串(|) 15.3.7 匹配任意单个字符(.) 15.3.8 创建字符集合...
  • Python核心编程(中文第二版)

    热门讨论 2009-10-02 12:08:14
     3.4.2 主程序书写测试代码   3.5 内存管理   3.5.1 变量定义   3.5.2 动态类型   3.5.3 内存分配   3.5.4 引用计数   3.5.5 垃圾收集   3.6 第一个Python程序   3.7 相关模块和开发...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

在word中模板文件扩展名为