c # копировать из текстового файла в текстовый документ - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу скопировать данные из текстового файла в файл слова. Я уже пробовал это с различными альтернативами, такими как string array, StringBuilder и StreamReader, используя Interop, который работает хорошо, но это занимает слишком много времени. Было бы очень благодарно, если бы кто-нибудь мог предложить мне лучший вариант. Прошел через много форм в Интернете, но не смог найти.

К вашему сведению: мой текстовый файл содержит более 1 000 000 строк.

Это одна из тех, которые я пробовал:

string[] lines = File.ReadAllLines(path); //path is text file path
var doc = new MSWord.Document();

foreach (string lin in lines)
{
    doc.Content.Text += lin.ToString();
}

doc.Save();

Ну, это хорошо работает, но занимает много времени, а также иногда выдает ошибку вроде:

Необработанное исключение: System.Runtime.InteropServices.COMException: Word столкнулся с проблемой.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Microsoft Word может читать текстовые файлы - так почему бы не прочитать текстовый файл в документе Interop Word, а затем преобразовать, используя один из методов SaveAs.

Я тестировал текстовый файл размером 3400 Мбайт и 1000000 строк - в результате получился файл DOCX размером 22 Мбайт:

MSWord.Application appAC = new MSWord.Application();
MSWord.Document doc = appAC.Documents.Open("TestRead.txt");
doc.SaveAs2(FileName:"TestSave", FileFormat:WdSaveFormat.wdFormatDocumentDefault);
doc.Close();
appAC.Quit();

Обратите внимание, что Microsoft заявляет, что максимальный размер документа составляет 32 МБ - текстовый файл превысил это значение, но полученный файл DOCX был меньше - ваше исключение может быть связано с размером окончательного файла.

0 голосов
/ 04 сентября 2018
    static void Main(string[] args)
    {
        Word.Application wordApp = new Word.Application();
        Word.Document wordDoc = wordApp.Documents.Add();
        Stopwatch sw = Stopwatch.StartNew();
        System.Console.WriteLine("Starting");
        string path = @"C:\";
        StringBuilder stringBuilder = new StringBuilder();
        using (FileStream fs = File.Open(path + "\\big.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (BufferedStream bs = new BufferedStream(fs))
        using (StreamReader sr = new StreamReader(bs))
        {
            wordDoc.Content.Text = sr.ReadToEnd();
            wordDoc.SaveAs("big.docx");
        }
        sw.Stop();
        System.Console.WriteLine($"Complete Time :{sw.ElapsedMilliseconds}");
        System.Console.ReadKey();
    }

Выход:

Starting
Complete Time :5556

Или Вы можете использовать Параллель:

    using (StreamReader sr = new StreamReader(bs))
    {
        Parallel.ForEach(sr.ReadToEnd(), i=>
        {
            stringBuilder.Append(i);
        });
        wordDoc.Content.Text = stringBuilder.ToString();
        wordDoc.SaveAs(path + "\\big3.docx");
    }

Выход:

Starting
Complete Time :2587
...