【问题标题】:Insert List<string> into word document将 List<string> 插入 word 文档
【发布时间】:2016-11-14 22:19:31
【问题描述】:

我目前正在尝试找到一种方法来读入并将数据插入到 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();

    }
}

现在,这成功填充了列表数据 - 但我正在尝试在第 [16] 个索引处附加每个新的测试元素,并将其保存到 word 文档中。有没有一种简单的方法可以做到这一点,还是我只是在想这个问题?

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

我在文档中的其他几个地方使用书签来添加数据,但我认为在这种情况下不能使用书签来放置数据 - 或者如果我不必使用我想远离那个书签。

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

编辑 2: 本质上我是在动态获取数据,我不确定需要向文档中添加多少记录/行,因此可能如下:

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

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

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

我正在尝试将每个元素,即:Test1 Test2 Test3 分别放在各自的列中(见上文)

【问题讨论】:

  • 从您的帖子中不清楚您到底想要完成什么。 我正在尝试在第 [16] 个索引处附加每个新的测试元素,并将其保存到 word 文档中...???
  • 添加了一些内容以提高清晰度 - 这有帮助吗?我只是想将 List 的每个元素添加到特定索引并将其附加到 word 文档的特定位置。
  • @JohnG 是的,我基本上想将数据列表的每个元素添加到文档中的第 [16] 行并保存。目标是将字符串列表的每个元素添加到文档中的第 [16] 行的新行中,并在每个项目之间添加一个制表符以创建各种“列”。很像:“\tTest 2\tName\tAmount
  • @JohnG 我不能分享原件——基本上原件一共有42行,标题行在文件的第15行(data)所以,如果data包含 5 个元素 - 我正在尝试将每个元素插入到文档的第 16 行。 (所以每个新行都会被下推一个 - 在文档中添加一个新行,所以在这个例子中我会以 47 行结束。
  • 如果你不能分享原版... 做一个测试,这样我们就可以看到你必须从什么开始。当您说 所以,如果数据包含 5 个元素... 如果原始文档有 42 行,则不会发生这种情况...您正在读取原始文档中的每一行并将字符串放入列表数据中.这令人困惑。另外我要删除我以前的cmets。

标签: c# ms-word office-interop


【解决方案1】:

再一次,我完全不明白为什么要将单词文件读入字符串列表数组。这只是将您在第 15 行之后显示的文本添加到 word 文档中。您没有指定测试 1、测试 2、测试 3... 的来源。

编辑:添加了一个 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();

}

【讨论】:

  • 添加了“编辑 2”以获得更多说明。
  • 测试 1、2 3 等来自单独的系统,因此我可以将它们放入列表中以使用它们。我阅读整个文件的唯一原因是我试图查看将文本放置在哪个索引处。我添加了一张新图片来进一步解释。
  • 简而言之 - 与使用文本行(虽然它可能有助于理解文档的结构)相比,您这样做的方式要优越得多。我会用我的确切代码发布答案并解释 - 感谢约翰的所有帮助!
  • @confusedandamused...很高兴这有帮助。我添加了一个 try catch 以防文档没有 16 个段落。
  • 我也发布了我对我所取得成就的回答 - 再次感谢您的帮助!
【解决方案2】:

所以我发现(出于我的目的)是通过在特定段落插入将字符串列表插入由制表符分隔的临时列中最简单的方法。

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

填充列表时,您将放置在特定段落标记处,动态附加制表符和换行符非常有用。稍后这将更容易循环遍历列表并将它们很好地放置在文档上。

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

因此,我正在填充的列将如下所示:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多