在Visual Studio中用C#操作Word:动态循环创建表格并添加内容
Hey there, let's get this sorted out. Your goal is to generate tables dynamically for each drug, fill their cells, and add non-table content between each table—and the main issue with your current code is that it's inserting every table at the very start of the document (using Range(0,0)), which means all tables end up stacked on top of each other without the intervening content you need.
Here's a revised approach that fixes this and adds the functionality you're looking for:
// Store the active document in a variable for cleaner, more efficient code Word.Document doc = this.Application.ActiveDocument; foreach (var drug in p.Drugs) { // Insert the table at the END of the current document content // Subtract 1 from End to avoid inserting after the final paragraph mark Word.Range insertRange = doc.Range(doc.Content.End - 1, doc.Content.End - 1); Word.Table drugTable = doc.Tables.Add(insertRange, 5, 1); // Populate each table cell with drug-specific information // Adjust the rows and content to match your actual data structure drugTable.Cell(1, 1).Range.Text = $"Drug Name: {drug.Name}"; drugTable.Cell(2, 1).Range.Text = $"Prescribed Dosage: {drug.Dosage}"; drugTable.Cell(3, 1).Range.Text = $"Frequency: {drug.Frequency}"; drugTable.Cell(4, 1).Range.Text = $"Treatment Duration: {drug.Duration}"; drugTable.Cell(5, 1).Range.Text = $"Special Notes: {drug.Notes}"; // Optional: Add basic formatting to make tables easier to read drugTable.Borders.Enable = 1; // Turn on cell borders drugTable.Rows.Alignment = Word.WdRowAlignment.wdAlignRowCenter; // Add your "bunch of other stuff" (non-table content) after the table // Move the range to the end of the table first Word.Range contentRange = doc.Range(drugTable.Range.End, drugTable.Range.End); contentRange.InsertParagraphAfter(); // Add a blank paragraph separator contentRange = doc.Range(doc.Content.End - 1, doc.Content.End - 1); contentRange.Text = $"Additional context for {drug.Name}: [Your custom text, lists, or media here]\n\n"; // You can expand this section to include bullet points, images, or other Word elements as needed }
Key Fixes & Explanations:
- Correct Insert Position: Instead of using
Range(0,0)(which pins every table to the document start), we targetdoc.Content.End - 1to add each new table after the existing content. This ensures your tables and intervening content appear in the order of your loop. - Cell Population: Access individual cells directly with
Cell(row, column)and set theirRange.Textproperty to your drug data. Tweak the row count and content to match your actual dataset. - Intervening Content: After each table, we shift the range to the table's end, insert a paragraph break, then add your custom non-table content. This keeps tables separated and your document structured as intended.
- Cleaner Document Reference: Storing the active document in a
docvariable reduces redundant calls and makes the code easier to maintain.
A quick note on your original code: Using Range(0,0) in every loop iteration would insert later tables before earlier ones (since Word inserts content at the start of the specified range), which is why you weren't seeing the separated structure you wanted.
内容的提问来源于stack exchange,提问作者Scott Wein

