RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 560133
Accepted
Andrew_STOP_RU_AGRESSION_IN_UA
Andrew_STOP_RU_AGRESSION_IN_UA
Asked:2020-08-28 03:02:43 +0000 UTC2020-08-28 03:02:43 +0000 UTC 2020-08-28 03:02:43 +0000 UTC

如何轻松使用/打开/编辑/保存 Excel - xlsx/CSV 文件

  • 772

无论我搜索了多少,一切都以某种方式痛苦地复杂且过于实用......

我想要最大程度的简单性——像处理二维字符串数组一样处理表格。

我想出的答案如下:)


完整的 CSV 支持应包括:

  1. 更改分隔符的能力
  2. 读取定界符之间的单元格
  3. 阅读线
  4. 如果单元格中有分隔符,单元格必须被引用并由读者自己正常处理
  5. 如果下一行符号在单元格中,则单元格必须用引号括起来,通常由读者自己处理。
  6. 如果单元格是带引号的,而且里面有引号,那么也应该处理无误。
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Andrew_STOP_RU_AGRESSION_IN_UA
    2020-08-28T03:02:43Z2020-08-28T03:02:43Z

    精益求精:

    在这里,我编写了一个非常简单的基于 ClosedXML 的库,以便能够毫不犹豫地将 MS Excel 表格作为二维数组使用:还有什么更容易使用的呢?

    使用我的班级的最终代码示例:

    Excel xl = new Excel(); //создаем инстанс
    
    xl.FileOpen("c:\\file1.xlsx"); //открываем файл
    
    var row1Cell6Value = xl.Rows[0][5]; //вытягиваем значение из 1 строки 6й ячейки
    
    xl.AddRow("asdf","asdffffff","5"); //добавляем еще одну строку с 3мя ячейками после последней существующей строки
    
    xl.FileSave("c:\\file2.xlsx"); //сохраняем файл
    

    其实这些都是方法——苦行极简主义:)

    如果需要写公式,可以使用如下代码:

    var widthAdress = Excel.GetExcelPos(0, 1);
    var heightAdress = Excel.GetExcelPos(0, 2);
    
    xl.Rows[0][0] = String.Format("={0}*{1}", widthAdress , heightAdress);
    

    格式文件:

    并且使用完全相同的苦行者方法,有一个与处理二维数据数组一样简单的方法来处理 CSV 文件。

    例如,在 Unity 上将不起作用。这是因为我不得不使用 VB 库。但在桌面应用程序中一切正常。

    Csv csv = new Csv(); //создаем инстанс читалки
    
    csv.FileOpen("c:\\file1.csv"); //открываем файл
    
    var row1Cell6Value = csv.Rows[0][5]; //читаем 6ю ячейку 1й строки
    
    csv.AddRow("asdf","asdffffff","5"); // добавляем строку из 3х ячеек
    
    csv.FileSave("c:\\file2.csv"); // сохраняем файл
    

    您可以在此处找到这两个类的实际代码: https ://github.com/ukushu/DataExporter


    为什么我的代码是这样写的而不是其他方式(Excel)

    这个块对于那些没有足够的我的以及想要使用 Microsoft Excel 的更多功能的人很有用。

    起初我尝试使用Microsoft.Office.Interop.Excel处理 Excel 文件,实际上:

    • 慢(我在 22 秒内保存了一张只有 11,250 个单元格的表格!!!)。(切勿将此库用于在服务器上生成 Office 文件的网站或应用程序:您将很快耗尽 RAM,并且网站或应用程序将崩溃)。
    • 如果处理不当,它有很多内存泄漏(https://ru.stackoverflow.com/a/464115/186752)
    • 需要特定版本的 MS Office。对于您的应用程序将运行的每台机器。
    • 使用不方便。
    • 它有许多缺陷,因此不必要的 Excel 服务将继续运行......

    我认为通过它进行交互是一个非常不幸的决定。


    然后我尝试通过 OleDB 工作。这条路让我无处可去,仅仅是因为不可能在那里使用公式。您无法阅读公式 - 您只能将其写下来。总的来说,这种方式显然更好、更快、更愉快,但缺乏编辑公式的能力让我很不爽。


    所以我来到了 OpenXML。结果,也是比较难过的一段经历。和他一起工作简直不方便。不知道作者是怎么想的。


    我得出了最终的解决方案——OpenXML 的包装器——ClosedXML。该解决方案已经可以编写:

    • 方便且易于阅读的代码。
    • 这是一个相当快的代码。(保存一个包含 20,000 个单元格的文件花费 00:00:00.6787608,这比 Interop 路径快 57 倍以上)。
    • 它也不需要安装 MS Excel。:)

    重要缺点:

    • 我需要澄清它只适用于“.xlsx”文件!但不是“.xls”!
    • 使用 Excel 的解决方案需要调出多达 2 个库(OpenXML、ClosedXML)
    • 24

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5