将List <string>插入word文档

时间:2016-11-14 22:19:31

标签: c# ms-word office-interop

我正在尝试寻找一种读入方式,并将数据插入到word文档中。到目前为止,这是我得到的:

class Program
{
    static void Main(string[] args)
    {
        var FileName = @"C:\temp\test.DOC";
        List<string> data = new List<string>();
        Application app = new Application();
        Document doc = app.Documents.Open(@"C:\temp\test.DOC");

        foreach (Paragraph objParagraph in doc.Paragraphs)
        {
            data.Add(objParagraph.Range.Text.Trim());
        }
        //data.Insert


        data.Insert(16, "Test 1");
        data.Insert(16, "\tTest 2\tName\tAmount");
        data.Insert(16, "Test 3");
        data.Insert(16, "Test 4");
        data.Insert(16, "Test 5");
        data.Insert(16, "Test 6");
        data.Insert(16, "Test 7");
        data.Insert(16, "Test 8");
        data.Insert(16, "Test 9");
        data.Insert(16, "Test 10");

        var x = doc.Paragraphs.Add();
        x.Range.Text.Insert(0,"\tTest 2\tName\tAmount");

        doc.SaveAs2(@"C:\temp\test3.DOC");

        ((_Document)doc).Close();
        ((_Application)app).Quit();

    }
}

现在,这成功填充了List数据 - 但我正在尝试在第[16]个索引处附加每个新的测试元素,并将其保存到word文档中。有没有一种简单的方法来实现这一目标,还是我只是过度思考这个问题?

我意识到字符串列表与表示word文档的Document对象是分开的。

我在文档中有一些其他地方使用书签添加数据,但我认为不可能使用书签将数据放在此实例中 - 或者如果我不必使用书签我想偏离它。

编辑:我试图在数据[]中的[16]位置插入X个元素。

编辑2: 基本上我是动态地获取数据,我不确定我需要向文档添加多少记录/行,所以它可以如下:

[15]
[16]\tName\tID\tAMOUNT
[17]\tName\tID\tAMOUNT
[18]\tName\tID\tAMOUNT

由于标题已经存在(NAME,ID,AMOUNT),并且每次运行程序时我都不确定我将在文档中插入多少元素 - 所以只要放置每个元素在另一个下面,在文档模板的第16行,我已经设置了应该完成我想要做的事情。

图1 - 图像成字符串数组 图2 - 将内容添加到字符串后的图像 - 这是生成的文档。 (这是要保存的)

Image into string array Image after adding content into the string - this is what the resulting document

enter image description here 我试图将每个元素ie:Test1 Test2 Test3分别放在每个列中(参见上文)

2 个答案:

答案 0 :(得分:1)

对于你为什么要将word文件读入字符串列表数组,我完全感到困惑。这只是将您在第15行之后显示的文本添加到word文档中。您没有指定WHERE Test 1,Test 2,Test3 ....来自。

编辑:添加了一个try-catch,以防万一文档没有至少16个段落。

static void Main(string[] args)
{

  List<string> data = new List<string>();
  Application app = new Application();
  Document doc = app.Documents.Open(@"C:\temp\test.DOC");

  string testRows = "Test 1\n\tTest 2\tName\tAmount\nTest 3\nTest 4\nTest 5\nTest 6\nTest 7\nTest 8\nTest 9\nTest 10\n";

  try
  {
    var x = doc.Paragraphs[16];
    x = doc.Paragraphs.Add(x.Range);
    x.Range.Text = testRows;
    doc.SaveAs2(@"C:\temp\test3.DOC");
  }
  catch (System.Runtime.InteropServices.COMException e)
  {
    Console.WriteLine("COMException: " +  e.StackTrace.ToString());
    Console.ReadKey();
  }
  ((_Document)doc).Close();
  ((_Application)app).Quit();

}

答案 1 :(得分:0)

所以我想出的(就我的目的而言)最简单的方法是将一个字符串列表插入到由制表符分隔的临时列中,方法是插入特定段落。

由于我也使用书签来放置文本 - 我发现从文档副本开始工作而不是担心每次删除/创建书签都很有用。

当填充您要放置在特定段落标记的列表时,动态添加制表符和新行章程是很有用的。稍后,这将使循环列表更容易,并将它们很好地放在文档上。

根据您要放置列的方式,必须确定一些逻辑以正确地隔离所有内容。我这样做是通过为列和修剪创建最大长度,并通过添加特定数量的制表符来适应更小/更大的长度。

所以,我填充的列看起来像是:

myList.Add("\t12345678912345\tJohn Doe\t\t\t\t123456\r\n");
myList.Add("\987654321654987\tJohn Smith\t\t\t\98765\r\n");

这些行将插入第17段,并整齐地放在标题下。

最后,我决定使用书签来放置单行文本,例如日期,标题和签名值,因为这些值不需要正确间隔或任何其他值。

最后,我删除了我正在处理的word文档的副本,并删除了pdf(因为在我的情况下,我是通过电子邮件发送的)

感谢你帮助@JohnG - 我希望这个答案可以帮助遇到它的人。我删除了try-catch,因为我也在模板中工作。

File.Copy(sCurrentPath + "\\" + "testTemplate.DOC", sCurrentPath + "\\" + "test.DOC");

Application app = new Application();
Document doc = app.Documents.Add(sCurrentPath + "\\" + "test.DOC");

foreach (string sValue in myList)
{
    var List = doc.Paragraphs[17];
    myList = doc.Paragraphs.Add(myList.Range);
    myList.Range.Text = sValue;
}

if (doc.Bookmarks.Exists("Date"))
{
    object oBookMark = "Date";
    doc.Bookmarks.get_Item(ref oBookMark).Range.Text = DateTime.Now.ToString("MM/dd/yyyy");
}
if (doc.Bookmarks.Exists("Signature"))
{
    object oBookMark = "Signature";
    doc.Bookmarks.get_Item(ref oBookMark).Range.Text = "My Name";
}
if (doc.Bookmarks.Exists("Title"))
{
    object oBookMark = "Title";
    doc.Bookmarks.get_Item(ref oBookMark).Range.Text = "Title Here";
}

doc.ExportAsFixedFormat(sCurrentPath + "\\" + "test.pdf", WdExportFormat.wdExportFormatPDF);

File.Delete(sCurrentPath + "\\" + "testCopy.DOC");

File.Delete(sCurrentPath + "\\" + "test.pdf");

((_Document)doc).Close();
((_Application)app).Quit();