Документ C# Microsoft Word по автоматизации вставки диаграмм.C#

Место общения программистов C#
Ответить
Anonymous
 Документ C# Microsoft Word по автоматизации вставки диаграмм.

Сообщение Anonymous »

Процесс: в соответствии со словом-шаблоном в нем много закладок, и каждую закладку необходимо вставить в отдельную диаграмму (редактируемую диаграмму, а не изображение). Но этот шаблон имеет сотни закладок, а также ему необходимо создавать сотни файлов, поскольку создание одного файла занимает около часа, а это слишком медленно.

Код: Выделить всё

//here a easy example

Main(string[] args)
{
CloseAllOfficeProcess(); // close all

var Locations = new List { "l1", "l2", "l3" }; // different regions
string OutputDir = @"E:\test\out\";
string WordTemplatePath = @"E:\test\test.docx";

await SyncWordExcelData(WordTemplatePath, OutputDir, Locations, 3);
}

async Task SyncWordExcelData(string WordTemplatePath, string OutputDir, List Locations, int maxParallelism)
{
Application wordApp = new Application();
try
{

var partitions = Locations
.Select((location, index) => new { location, index })
.GroupBy(x => x.index % maxDegreeOfParallelism)
.Select(g => g.Select(x => x.location).ToList())
.ToList();

var tasks = new List();

foreach (var partition in partitions)
{
tasks.Add(Task.Run(async () =>
{

foreach (var location in partition)
{
Document docCopy = CreateTemporaryDocument(WordTemplatePath, wordApp, OutputDir);

await ProcessWord(docCopy, OutputDir, location);

docCopy.Save();
docCopy.Close(false);
}

}));
}

await Task.WhenAll(tasks);
}
finally
{
wordApp.Quit();

}
}

static Document CreateTemporaryDocument(string templatePath, Application wordApp, string outputDir)
{

string tempFilePath = Path.Combine(outputDir, Guid.NewGuid() + ".docx");
File.Copy(templatePath, tempFilePath, overwrite: true);

return wordApp.Documents.Open(tempFilePath);
}

static async Task ProcessWord(Document Doc, string OutputDir, string location)
{
foreach(Bookmark bookmark in Doc.Bookmarks)
{
string bookmarkName = bookmark.Name;
Word.Range bookmarkRange = bookmark.Range;
object rangeObj = bookmarkRange;

InlineShape inlineShape = Doc.InlineShapes.AddChart((Microsoft.Office.Core.XlChartType)Excel.XlChartType.xlColumnClustered, ref rangeObj);
Word.Chart chart = inlineShape.Chart;

chart.HasTitle = false;
chart.HasLegend = false;

}

await Task.CompletedTask;
}

Я снова рассматриваю многопроцессорность и многопоточность, я обнаружил, когда пытался, хотя одновременное выполнение более одной операции COM приведет к выдаче исключения System.Runtime.InteropServices.COM . То есть, если за короткий промежуток времени будет выполнено более одной операции, будет сообщено об ошибке.
Сейчас я использую
Office2019
Microsoft.Office .Interop.Excel
Microsoft.Office.Interop.Word

Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-charts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»