C#操作Word,写数据,插入图片
本篇介绍的是如何在C#中往word里面写入数据。
如何在线的操作文档: c#在线操作文档
关于Aspose.Word控件的介绍,请戳→ 介绍
首先需要去下载这个dll文件,然后引用到你的项目当中。地址→查看下载地址
附一个辅助类来操作此dll
利用书签把数据写入到Word当中
文本和图片
第一步,你先要去准备Word模板(新建一个Word然后复制到项目中)
第二步,在Word模板中插入书签
在word中准备你需要把数据填写到那个位子,(Text:我所传进来的文本所在位子 Img:传进来的图片所在位子)
然后我们就可以在word中插入书签了
插入Img标签完成后,定位在img把img删除,我们只是需要定位。
我们的页面
<div>写文字</div> <label for="txtText">你想写的数据:</label> <input type="text" name="txtText" runat="server" id="txtText" /> <hr /> <div>插入图片</div> <label>上传你的图片:</label> <asp:FileUpload ID="fuUpload" runat="server" /> <br />
后台
protected void btnSubmit_Click(object sender, EventArgs e) { if (fuUpload.HasFile) { string fileName = ""; string SavaPath = Server.MapPath("~/img/"); string ext = Path.GetExtension(fuUpload.FileName); List<string> extList = new List<string>() { ".jpg", ".png", ".jpeg", ".gif", ".bmp" }; if (extList.Any(x => x == ext)) { string random = Guid.NewGuid().ToString().Substring(0, 4); fileName = random + ext; fuUpload.SaveAs(SavaPath + fileName); //图片保存到项目中 //写入word string FilePath = "WriteWord+" + new Random().Next(0, 99) + ".doc"; System.IO.File.Copy(Server.MapPath("~/WriteWord.doc"), FilePath, true); //复制 System.IO.File.SetAttributes(FilePath, System.IO.FileAttributes.Normal);//设置文件属性 只读 还是可修改
Document doc = new Document(FilePath); //这段代码可以封装,用的时候调用就行 //if (doc.Range.Bookmarks["text"] != null) //{ // Bookmark mark = doc.Range.Bookmarks["text"]; // mark.Text=txtText.Value.Trim(); //} BookAddMark(doc, "text", txtText.Value.Trim()); //把文本写入到指定标签的位子 DocumentBuilder builder = new DocumentBuilder(doc); //builder里面有个write方法 builder.MoveToBookmark("img"); //找到你图片插入的位子,定位到这里 //builder.InsertHtml("<img scr='~/img/"+ fileName + "'>"); 这样word里面是读不出图片的 //InserImage()有很多重载它需要什么你就给什么进去 // builder.InsertImage(Server.MapPath("~/img/" + fileName)); //第一种,直接给路径,当设置不了宽高 //图片的路径要找对 FileStream fs = new FileStream(Server.MapPath("~/img/" + fileName), FileMode.Open); byte[] imgByte = new byte[fs.Length]; fs.Read(imgByte, 0, imgByte.Length); builder.InsertImage(imgByte, 200, 200); //以字节组的方式写入word fs.Close(); builder = null; doc.Save(Server.MapPath("~/Word/" + FilePath)); //保存word文档 } else { Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myscript", "<script>alert('上传的文件类型不支持');</script>"); } } else { Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myscript", "<script>alert('请选择你所需要上传的文件');</script>"); } }
public void BookAddMark(Document doc, string parama, string paramb) { if (doc.Range.Bookmarks[parama] != null) { Bookmark mark = doc.Range.Bookmarks[parama]; mark.Text = paramb; } }
word里面生成的数据如下
如果需要写一个集合里面的数据,用书签就不是很方法,因为我们不能控制集合的数量,拿我们就会用到上面说的wirte方法,配合表格插入数据
我们在word里面生成一个表格
例:我们需要生成很多数据
我们可以先把模板表格确定好
这就是我们的模板
再来看我们是如何写数据
protected void btnWriteData_Click(object sender, EventArgs e) { string FilePath = "WriteWord+" + new Random().Next(0, 99) + ".doc"; System.IO.File.Copy(Server.MapPath("~/WriteWord.doc"), FilePath, true); //复制 System.IO.File.SetAttributes(FilePath, System.IO.FileAttributes.Normal);//设置文件属性 只读 还是可修改 Document doc = new Document(FilePath); List<Person> perList = new List<Person>() { new Person(){ Name="张三", Age="18", sex="男"}, new Person(){ Name="李四", Age="18", sex="男"}, new Person(){ Name="王五", Age="18", sex="男"}, new Person(){ Name="赵六", Age="18", sex="男"}, new Person(){ Name="……", Age="……", sex="……"} }; DocumentBuilder builder = new DocumentBuilder(doc); NodeCollection allTables = doc.GetChildNodes(NodeType.Table, true); //拿到所有表格 Aspose.Words.Tables.Table table = allTables[0] as Aspose.Words.Tables.Table; //拿到第1个表格 foreach (Person item in perList) { var row = table.Rows[table.Rows.Count - 1].Clone(true); //复制最后一行 table.Rows.Insert(table.Rows.Count - 1, row); //插入到这行的上面 builder.MoveToCell(0, table.Rows.Count - 2, 0, 0); //移动单元格到第几行第几列 builder.Write(item.Name); //写入数据 builder.MoveToCell(0, table.Rows.Count - 2, 1, 0); builder.Write(item.Age); builder.MoveToCell(0, table.Rows.Count - 2, 2, 0); builder.Write(item.sex); } builder = null; doc.Save(Server.MapPath("~/Word/" + FilePath)); } private class Person { public string Name { get; set; } public string Age { get; set; } public string sex { get; set; } }
生成的Word里面的表格如下: