我正在Visual Studio中构建Excel加载项,并尝试将用户选择的数据范围写入文本文件。用户可以在Windows窗体上选择多个(可以是非连续的)范围。所选范围的地址存储在集合rangesCollection
中。到目前为止,我已经尝试遍历这些范围内的单元格,将单元格写入一个大字符串,最后将字符串写入.txt文件:
Dim writefile As New StreamWriter(filePath & "data.txt")
dim sep, text, s as string
sep = ";"
for each ref in rangesCollection
srow = ""
for each cell in Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet.range(ref.Text)
srow = srow & cell.text & sep
next cell
s = s & vbCrLf & srow
next ref
writefile.write(s)
writefile.close()
即使是稍微大一点的数据集,解决方案也变得非常慢。例如,写入3列数据,每列长度为~7500个单元大约需要15秒。
任何人都可以帮我解决更快的问题吗?
答案 0 :(得分:0)
您可以将文件另存为CSV格式。 使用文本编辑器程序(或显然是以编程方式)可以轻松编辑结果。 它会为excel文件中的每一行写一个文本行,用';'
分隔列示例(列的字母,行的数字):
A1;B1
A2;
A3;B3
A4;B4
A5;B5
;B6
您可以制作excel文件的临时副本并保留原始未编辑的文件,从临时文件中删除未选择的单元格,然后将其另存为CSV文件。
答案 1 :(得分:0)
我设法以稍微不同的方式解决问题。在此处找到解决方案:VB.NET/COM Server code way slower than Excel VBA code
之前的问题是循环并通过访问每个单元格,解决方案是将整个范围写入数组并使用其元素:
Dim writefile As New StreamWriter(filePath & "data.txt")
for each ref in rangesCollection
Dim values(colLength, 1) As Object
Dim ran As Excel.Range = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet.range(ref.text)
values = ran.value
for j=1 to colLength
writefile.Write(values(j, >1) & ";")
Next
writefile.Write(vbCrLf)
Next
writefile.close()
这似乎很简单和基本,但也许这段代码可以在将来帮助某人。