我正在尝试寻找一种读入方式,并将数据插入到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 - 将内容添加到字符串后的图像 - 这是生成的文档。 (这是要保存的)
答案 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();