如何编写excel文件更快(writetable、writecell writematrix或其他)

177(30天)
我多年来经历了很多话题,这是我最近发现:
  • writetable & co比旧的快xlswrite(或替代我发现在matlab中央)
  • writetable & co仍超慢当写入excel。不是难以承受的水平,但如果数据规模足够大,你必须写几十或几百个文件(1 - 100 MB),你可以花几分钟甚至几小时等待。
一些小技巧我发现加快写作速度约4或5 x是:
  • “AutoFitWidth”= false……这是真的在默认情况下,禁用它好几次让我实现更快的写入速度(当UseExcel = false,否则更)
  • “UseExcel”= true……默认这是错误的,我认为这是一件好事,避免开放一个Excel好几次但是你可以挤另一个实例通过切换为true
奇怪的交互是“AutoFitWidth”= true尤其是惩罚当UseExcel = false,这就是默认的组合。当“UseExcel”是正确的,至少在我的例子中,我可以得到完整的4-5x增加甚至离开AutoFitWidth启用。
现在,因为即使这个技巧写速度仍然很低,我在想,有一个较低的水平的方式写excel输出?使用流和不知何故还保存到excel文件吗?我知道这是一个坏习惯保存到Excel但它仍然方便当你不得不为客户出口数据,等。分享一个Excel文件,而不是. txt或其他通常通常是一大亮点,为客户处理这方面会很高兴有一个更快的方式以编程方式编写matlab计算东西到Excel文件。
2的评论
大卫。Battini
大卫。Battini 2022年2月9日
不知道对不起。我不需要大规模编写.xlsx文件之后并没有测试了之后发现你可以看到什么。
我是在2021年的情况可能有点不同在2021或2022(不确定)。
一般来说我建议AutoFitWidth = false,使尽可能多的电话可以与UseExcel = true以来第一次调用总是最慢的一个。
唯一的其他解决方案将储蓄从matlab . csv,然后编写一个宏或一些VB行autoimport . csv文件excel和创建你需要的所有表。总的执行时间肯定会更快但是设置代码肯定是更乏味。也许你也可以让excel的呼唤从Matlab和VB代码仍然做所有你的东西用一个电话但是我从来没有试过诚实。

登录置评。

答案(2)

大卫。Battini
大卫。Battini 2021年5月30日
编辑:大卫。Battini 2021年5月30日
清晰的所有
选择= {“写模式”,“replacefile”};
我= 1:25;varNames{我}= char (randi(33[126] 1 20 +兰迪(20)));结束
x = array2table (rand(15000年25));
x.Properties。VariableNames = varNames;
抽搐;writetable (x,“test1.xlsx”,“UseExcel”假的,“AutoFitWidth”假,选择{:});toc
%运行时间是2.8秒。%第一个电话
抽搐;writetable (x,“test2.xlsx”,“UseExcel”假的,“AutoFitWidth”假,选择{:});toc
%运行时间是2.7秒。%的第二个电话
清晰的所有
选择= {“写模式”,“replacefile”};
我= 1:25;varNames{我}= char (randi(33[126] 1 20 +兰迪(20)));结束
x = array2table (rand(15000年25));
x.Properties。VariableNames = varNames;
抽搐;writetable (x,“test1.xlsx”,“UseExcel”,真的,“AutoFitWidth”假,选择{:});toc
%运行时间是4.7秒。%第一个电话
抽搐;writetable (x,“test2.xlsx”,“UseExcel”,真的,“AutoFitWidth”假,选择{:});toc
%运行时间是2.0秒。%的第二个电话
清晰的所有
选择= {“写模式”,“replacefile”};
我= 1:25;varNames{我}= char (randi(33[126] 1 20 +兰迪(20)));结束
x = array2table (rand(15000年25));
x.Properties。VariableNames = varNames;
抽搐;writetable (x,“test1.xlsx”,“UseExcel”假的,“AutoFitWidth”,真的,选择{:});toc
%运行时间是3.7秒。%第一个电话
抽搐;writetable (x,“test2.xlsx”,“UseExcel”假的,“AutoFitWidth”,真的,选择{:});toc
%运行时间是3.6秒。%的第二个电话
清晰的所有
选择= {“写模式”,“replacefile”};
我= 1:25;varNames{我}= char (randi(33[126] 1 20 +兰迪(20)));结束
x = array2table (rand(15000年25));
x.Properties。VariableNames = varNames;
抽搐;writetable (x,“test1.xlsx”,“UseExcel”,真的,“AutoFitWidth”,真的,选择{:});toc
%运行时间是4.8秒。%第一个电话
抽搐;writetable (x,“test2.xlsx”,“UseExcel”,真的,“AutoFitWidth”,真的,选择{:});toc
%运行时间是2.0秒。%的第二个电话
抽搐;保存(“test3.mat”,“x”);toc
%运行时间是0.12秒。
我改变了你的长椅上代码有点,因为几乎没有差异(表1坳只有)。
我想我们不能看到相同的刺激我看到真实的数据。可能有更多的区别在创建表和附加数据作为我所做的。同时我可以告诉你,越高越慢的过程。我真实的数据是在30 - 40周期时间(我写几个表和4编写调用)使用默认选项和5 - 10每循环与非缺省选项。
考虑第二个调用它基本上只有2 x从默认为非默认的选择。
PS:我完全同意的格式。我刚到这个“需要”的分享与客户和我总是怀疑代码优化(尽管我不是一个软件工程师和我很坏)

1月
1月 2021年5月30日
谢谢你分享这个有用的信息。
我理解正确你建议:
writetabele(数据、“UseExcel”,真的,“AutoFitWidth”假)
在R2018b AutoFitWidth并不存在,所以它是新的。一些时间在我的Windows机器:
x =表(rand (1000、100));
抽搐;writetable (x,“test1.xlsx”,“UseExcel”,真正的);toc
%运行时间是1.795150秒。%第一个电话
抽搐;writetable (x,“test2.xlsx”,“UseExcel”,真正的);toc
%运行时间是0.667419秒。%的第二个电话
抽搐;writetable (x,“test3.xlsx”,“UseExcel”、假);toc
%运行时间是1.489082秒。%同时重复调用
抽搐;保存(“test4.mat”,“x”);toc
%运行时间是0.027679秒。
Excel文件格式xls和.xlsx不是有效的读和写访问。有许多二进制格式,这比Excel类型。
我个人讨厌Excel文件格式是原因之一。
你能请一些包括计时吗 “AutoFitWidth”,假的 吗?

s manbetx 845


释放

R2021a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的