Tag: 性能

Excel vba执行时间与单元格内容长度呈指数关系

我正在使用vba检查删除线文本的电子表格。 如 ActiveCell.Font.Strikethrough 只检测整个单元格中的删除线,我用下面的代码来删除删除线中的单个字符。 Dim iCh As Long Dim StrikethroughFont As Long: StrikethroughFont = 0 If Len(ActiveCell) > 0 Then For iCh = 1 To Len(ActiveCell) With ActiveCell.Characters(iCh, 1) If .Font.Strikethrough = True Then StrikethroughFont = StrikethroughFont + 1 End If End With Next iCh End If 代码正常工作。 问题是执行时间随着单元内容长度呈指数增长。 在每个单元中less于100个字符,代码运行速度超快。 在1个单元执行时间内有1000个字符的地方是30秒 – 仍然可以接受该项目 在一个单元执行时间约半个小时的地方有3000个字符。 在1个单元格中有5000个字符的地方Excel继续运行似乎永远,有时它崩溃 […]

奇怪的行为时分配一个Excel范围的公式的VBA数组

这是奇怪的…有人有一些知识或可以找出为什么发生这种情况? 在过去,我能够给Excel范围分配一组公式数组( 范例 Range("A1:A1000") = ArrayOfFormulas )。 这是工作正常和快速 ( 非常 快 )相比,分配逐个单元格( 例如单元格: Range("A" & i).Formula=ArrayOfFormula(i)在一个循环内,慢! )。 现在我正在使用Excel 2013,当试图将存储在string数组中的公式存储到Excel范围时,它不起作用(Excel中显示的是公式,而不是下面图片的左侧部分)不幸的是我不能检索旧的代码进行比较。 例如,以下代码在范围A1到A1000中显示“= 1 + 2”而不是“3”。 Sub AssignFormulas_1() Dim i as Long Dim FORML_ARRAY(1 To 1000, 1 To 1) As String For i = 1 To 1000 FORML_ARRAY(i, 1) = "=1+2" Next i Range("A1:A1000").Formula = FORML_ARRAY '<- Don't […]

如何在Open XML SDK中有效地caching和刷新stream

我使用OpenXML SDK 2.0生成大量数据的Excel文件,appox。 1000000行,我需要优化内存使用,因为我的机器速度非常快。 我想通过在运行时将部分生成的DOM树清空到文件来解决这个问题。 我做我自己的数据缓冲。 例如,我有100000条logging要写入,并且当我向Excel工作表中添加1000行时,我想要刷新到文件stream。 我通过使用方法worksheetPart.Worksheet.Save()来做到这一点。 Documantation说这个方法是Save():“把DOM树中的数据保存回部分,也可以多次调用,每次调用时,都会刷新stream。 foreach (Record m in dataList) { Row contentRow = CreateContentRow(index, m); // my own method to create row content //Append new row to sheet data. sheetData.AppendChild(contentRow); if (index % BufferSize == 0) { worksheetPart.Worksheet.Save(); } index++; } 这种方法的工作原理是内存使用graphics看起来很不舒服,内存隐约增长。 有没有人有任何想法如何解决这个问题?

C#Excel Interop在循环单元格时变慢

我试图从C#中的Excel文档中提取所有文本数据,并遇到性能问题。 在下面的代码中,我打开工作簿,遍历所有工作表,并循环使用范围中的所有单元格,从中提取每个单元格中的文本。 问题是,这需要14秒钟才能执行。 public class ExcelFile { public string Path = @"C:\test.xlsx"; private Excel.Application xl = new Excel.Application(); private Excel.Workbook WB; public string FullText; private Excel.Range rng; private Dictionary<string, string> Variables; public ExcelFile() { WB = xl.Workbooks.Open(Path); xl.Visible = true; foreach (Excel.Worksheet CurrentWS in WB.Worksheets) { rng = CurrentWS.UsedRange; for (int i = 1; i […]

什么架构来解决这个SystemOutOfMemoryException,同时允许我实例化一个工作表的单元格?

概要 这个问题是后续build设一个简单的电子表格API的愿望,同时保持对那些谁了解Excel的用户友好。 总结起来,这个问题与以下两点有关: 1. 如何从索引中实现列自我命名? ; 2. 如何使这个自定义工作表初始化更快? 。 目的 提供一个简化的Excel API,用作包含Application , Workbook , Worksheet和Range类/接口等内核组件的封装,同时仅公开每个对象的最常用对象属性。 用法示例 这个用法的例子是从unit testing中得到灵感的,这个unit testing使我能够把这个解决scheme提升到现在的地位。 Dim file as String = "C:\Temp\WriteTest.xls" Using mgr As ISpreadsheetManager = New SpreadsheetManager() Dim wb as IWorkbook = mgr.CreateWorkbook() wb.Sheets("Sheet1").Cells("A1").Value = 3.1415926 wb.SaveAs(file) End Using 现在我们打开它: Dim file as String = "C:\Temp\WriteTest.xls" Using mgr As […]

为什么Excel VBA在Outlookclosures时运行速度更快?

所以我一直注意到,当Outlookclosures时,我写的VBA代码运行速度明显加快。 这不是一个零星的事情:我可以用Outlook运行相同的代码10倍,每次打开一个体验速度显着较慢的处理速度,然后closuresOutlook并运行10次,每次都体验到更快的速度。 我也注意到,除了在代码运行的时候Excel“不响应”,零星的Outlook也是如此。 我知道Outlook是由Word支持的,所以如果我在Word中运行代码,这对我来说是有意义的。 但是,我的Excel VBA没有使用Outlook或Word。 这可能是什么原因? Excel和Outlook共享一些相同的过程? 我试过谷歌search无济于事。

在删除20,000+行Excel文件中的第一行时,出现Open XML SDK v2.0性能问题

使用OpenXML SDK v2.0删除20,000+行Excel文件中的第一行时,是否遇到任何性能问题? 我正在使用Open XML SDK文档中build议的删除行编码。 我需要几分钟的时间才能使用Open XML SDK删除第一行,但在Excel应用程序中仅需要一秒钟。 我终于发现,瓶颈实际上是在处理行删除的泡沫式的方法。 删除的行后面有很多行更新。 所以在我的情况下,大约有20,000行被更新,逐行移动数据。 我想知道是否有更快的方式做行删除。 有人有想法吗?

在OpenPYXL中运行5万行Excel文件的最快方法

我在Python中使用openpyxl,我试图通过5万行,并从每行抓取数据,并将其放置到一个文件中。 但是,我发现它越来越慢,我进入它越来越慢。 第一条1k线的速度非常快,不到一分钟,但在此之后,下一条1k线需要更长,更长的时间。 我正在打开一个.xlsx文件。 我不知道打开一个.txt文件作为一个CSV或什么东西或阅读一个JSON文件或更快? 或者转换成某种会更快读取的东西? 我在给定列中有20个唯一值,然后每个值的值都是随机的。 我试图抓住每个值的整个唯一值列的string。 价值1:1243,345,34,124,价值2:1243,345,34,124等 我正在运行“值”列表,查看名称是否存在于文件中,如果存在,则会访问该文件并将其添加到新值中,如果文件不存在,则会创build文件并然后将其设置为追加。 我有一个字典,所有的“附加写文件”的东西连接到它,所以任何时候我想要写东西,它会抓住文件名,附加的东西将在字典中可用,它会查找和写入该文件,所以它不会保持每次运行时打开新的文件。 第一个1K花了不到一分钟..现在我在4K到5K的纪录,它已经准备好了5分钟..似乎需要更长的时间,因为它在logging上升,我不知道如何加快速度。 它根本不打印到控制台上。 writeFile = 1 theDict = {} for row in ws.iter_rows(rowRange): for cell in row: #grabbing the value theStringValueLocation = "B" + str(counter) theValue = ws[theStringValueLocation].value theName = cell.value textfilename = theName + ".txt" if os.path.isfile(textfilename): listToAddTo = theDict[theName] listToAddTo.write("," + theValue) if […]

Excel:可以使用外部链接提高性能?

我想知道是否有使用外部链接与打开电子表格和复制单元格(使用VBA)的性能增益。 我会想象,Excel必须打开文件相同,但是当我testing使用下面的代码,外部链接出来更快: Dim t As Double Dim rng As Range For Each rng In shtId.Range("A1:A5") t = Now ThisWorkbook.Names("rngID").RefersToRange = rng ThisWorkbook.UpdateLink "H:\manualData.xlsx", xlExcelLinks Debug.Print "link: " & Format(Now – t, "######.0000000") t = Now Workbooks.Open "H:\manualData.xlsx", readonly:=True ActiveWorkbook.Close False Debug.Print "open: " & Format(Now – t, "######.0000000") Next Results: link: .0000116 open: .0000231 link: […]

适用于大型电子表格的Apache POI Java Excel性能

我有一个电子表格,我试图阅读与POI(我有xls和xlsx格式),但在这种情况下,问题是与xls文件。 我的电子表格大约有10,000行和75列,读取它可能需要几分钟时间(尽pipeExcel会在几秒钟内打开)。 我正在使用基于事件的阅读,而不是将整个文件读入内存。 我的代码的肉在下面。 现在有点乱,但是这实际上只是一个很长的switch语句,大部分都是从POI的例子中复制而来的。 使用事件模型的POI性能如此之慢是典型的吗? 我有什么办法来加速这个吗? 我觉得我的申请几分钟是不能接受的。 POIFSFileSystem poifs = new POIFSFileSystem(fis); InputStream din = poifs.createDocumentInputStream("Workbook"); try { HSSFRequest req = new HSSFRequest(); listener = new FormatTrackingHSSFListener(new HSSFListener() { @Override public void processRecord(Record rec) { thisString = null; int sid = rec.getSid(); switch (sid) { case SSTRecord.sid: strTable = (SSTRecord) rec; break; case LabelSSTRecord.sid: […]