【问题标题】:How to convert Excel file to CSV while retaining the cell information?如何在保留单元格信息的同时将 Excel 文件转换为 CSV?
【发布时间】:2020-05-20 12:39:19
【问题描述】:

有没有办法将包含多个选项卡的 excel 电子表格转换为 csv 文件(每个选项卡一个)并用单元格信息标记 csv 中的数据?

例如,在 Excel 中的下面一行:

在输出 csv 文件中应该如下所示:

[A1]Id,[B1]Author Name

[A2]1,[B2]Agatha Christie

[A3]2,[B3]Ayn Rand

[A4]3,[B4]Arthur Conan Doyle

我正在尝试使用 Python 来解决这个问题,但我还是很陌生。在这里,我遇到了许多关于使用 xlrd、pandas 等包将 Excel 转换为 CSV 的帖子。但我也想知道是否可以通过某种方式捕获单元格信息。

另外,如果有其他方法可以达到这个要求,请告知。

【问题讨论】:

  • 如果您尝试在 Python 中执行此操作,为什么要标记 R 和 Java 语言?这个问题似乎与这两种语言都没有任何关系。
  • 无论如何,为了解决您的问题,您可以使用 Pandas 并计算单元格信息 - 这是一个非常常规的模式。
  • 感谢 EJoshuaS 的回复。我在这里探索所有选项——Python、R、Java。任何可以帮助我实现这一目标的东西。我的首选方式是 python。如果它可以在 Python 中实现,我将继续删除 Java 和 R 标记。
  • 我对 R 不是很熟悉,但我认为这对 Pandas 来说非常简单——该模式足够规则,您可以将其导入 DataFrame,计算单元格信息,编辑它进入每个单元格,然后将其导出为 CSV 文件。
  • 这听起来很积极。我仍然需要了解数据帧(实际上是 Python 新手)。但我很快就会告诉你情况如何。谢谢!

标签: excel python-3.x csv


【解决方案1】:

也许是这样的......

from xlrd import open_workbook
from xlwt import Workbook
import os

for file in os.listdir('C:\\your_path_here\\'):
    if file.endswith('.xlsx'):
        rb = open_workbook('C:\\your_path_here\\' + str(file),formatting_info=False)
        num = rb.nsheets

for a in range(num): 

   rs = rb.sheet_by_index(a)
   sheet = (rs.name)

   new_book = Workbook()
   new_sheet = new_book.add_sheet(sheet)

   for row in range(rs.nrows):
       for col in range(rs.ncols):
           new_sheet.write(row, col, rs.cell(row, col).value)

   new_book.save('C:\\your_path_here\\' + str(sheet) + '.csv')

【讨论】:

  • 感谢您提供此解决方案。使用您的部分逻辑和 openpyxl 模块,我现在可以从 Excel 读取单元格并将单元格值与行和列信息一起保存在文本文件中。您能否提供一些见解,哪些在读取具有 10-12 个工作表的 Excel 文件时最有效,并且在每个工作表中读取大约 30K 单元格 - xlrd、openpyxl 或 pandas?所有这些数据都必须经过处理并保存到每个工作表的一个文本文件中(如原帖所述)。
  • 如果对您有帮助,请将其标记为答案。就效率而言,我不确定。您可以轻松地将计时器添加到任何 Python 脚本并计算任何进程的运行时间。见此链接:stackoverflow.com/questions/6786990/…
【解决方案2】:

如果您的数据框如下所示:

df
#>   Id        Author.Name
#> 1  1    Agatha Christie
#> 2  2           Ayn Rand
#> 3  3 Arthur Conan Doyle

那么你可以这样做:

df <- as.data.frame(mapply(function(x, y) paste0("[", y, 1:length(x), "] ", as.character(x)),
             df, LETTERS[seq_along(df)]))

以您想要的格式添加适当的 Excel 单元格。

输出:

df
#>       Id             Author.Name
#> 1 [A1] 1    [B1] Agatha Christie
#> 2 [A2] 2           [B2] Ayn Rand
#> 3 [A3] 3 [B3] Arthur Conan Doyle

如果你用

编写 csv
write.csv(df, "df.csv")

那么 df.csv 的内容会是这样的:

"","Id","Author.Name"
"1","[A1] 1","[B1] Agatha Christie"
"2","[A2] 2","[B2] Ayn Rand"
"3","[A3] 3","[B3] Arthur Conan Doyle"

【讨论】:

  • 谢谢艾伦。这看起来很简单。我会根据实际数据进行尝试,然后告诉你情况如何。
  • @Techblink 只要您的数据中的列少于 26 列,它就会起作用。如果你有更多,它仍然是可能的,但更复杂。
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2014-06-06
  • 2021-10-02
  • 2020-08-25
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多