gpt4 book ai didi

c# - 如何加快 Word Interop 处理速度?

转载 作者:行者123 更新时间:2023-11-30 15:21:58 29 4
gpt4 key购买 nike

我是 C# 的新手,并且编写了相当笨重的代码。我一直在网上学习很多类(class),很多人说有几种方法可以解决问题。现在我制作了一个程序,它将加载一个 .Doc Word 文件,然后使用 if 语句搜索相关信息。

现在我的解决方案的问题是这个程序需要永远!!!我说的是 30 分钟 - 1 小时来完成以下代码。

关于如何让我的小程序不那么笨拙有什么想法吗?我希望这个问题的解决方案能大大增加我的知识,所以在此先感谢大家!

问候克里斯

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int id = 0;
public int[] iD = new int[100];
public string[] timeOn = new string[100];
public string[] timeOff = new string[100];
public string[] dutyNo = new string[100];
public string[] day = new string[100];

private void button1_Click(object sender, EventArgs e)
{



Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document document = application.Documents.Open("c:\\Users\\Alien\\Desktop\\TESTJOBS.doc");
//the following for will loop for all words

int count = document.Words.Count;
for (int i = 1; i <= count; i++)
{
// the following if statement will look for the first word that is On
// this is then (on the file) proceded by 04:00 (thus i+2/3/4 respectively)
if (document.Words[i].Text == "On")
{
iD[id] = id;
// Console.WriteLine("ID Number ={0}", iD[id]);
dutyNo[id] = document.Words[i - 14].Text;
// Console.WriteLine("duty No set to:{0}", dutyNo[id]);
timeOn[id] = document.Words[i + 2].Text + document.Words[i + 3].Text + document.Words[i + 4].Text;
// Console.WriteLine("on time set to:{0}", timeOn[id]);
// the following if (runs if the last word was not "On" and then searches for the word "Off" which procedes "On" in the file format)
// this is then (on the file) proceded by 04:00 (thus i+2/3/4 respectively)
}
else if (document.Words[i].Text == "Off")
{
timeOff[id] = document.Words[i + 2].Text + document.Words[i + 3].Text + document.Words[i + 4].Text;
//Console.WriteLine("off time set to:{0}", timeOff[id]);
// the following if (runs if the last word was not "Off" and then searches for the word "Duty" which procedes "Off" in the file format)
// this is then (on the file) proceded by 04:00 (thus i+2/3/4 respectively)
}
else if (document.Words[i].Text == "Days" && !(document.Words[i + 3].Text == "Type"))
{

day[id] = document.Words[i + 2].Text;
//Console.WriteLine("day set to:{0}", day[id]);
//we then print the whole new duty out to ListBox1
listBox1.Items.Add(string.Format("new duty ID:{0} Time on:{1} Time off:{2} Duty No:{3} Day:{4}", iD[id], timeOn[id], timeOff[id], dutyNo[id], day[id]));
id++;
}


}

for (int i = 1; i <= 99; i++)
{
Console.WriteLine("new duty ID:{0} Time on:{1} Time off:{2} Duty No:{3} Day:{4}", iD[id], timeOn[id], timeOff[id], dutyNo[id], day[id]);
}


}
}
}

最佳答案

Office Interop 是 fairly slow .

Openxml 可能是 faster ,但文件是 .doc,因此它可能无法处理它。


但就像 this question 中的 Excel 一样有一种方法可以提高性能 - 不要访问 Range 中的每个单词按索引,因为据我所知,它会导致创建一个单独的 Range包装在 RCW 中的实例,这是应用程序性能瓶颈的主要候选者。

这意味着提高性能的最佳方法是将所有单词 (.Text)加载String 的一些可索引集合中s 在实际处理之前,然后才使用该集合来创建输出。

如何以最快的方式完成?我不太确定,但您可以尝试从 _Document.Words enumerator 中获取所有单词(虽然它可能会或可能不会更高效,但至少您将能够看到仅检索所需单词需要多长时间):

var words = document
.Cast<Range>()
.Select(r =>
r.Text)
.ToList();

或者您可以尝试使用 _Document.Content range Text,尽管您随后必须自己分隔各个单词。

关于c# - 如何加快 Word Interop 处理速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36519106/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com