如何转换/展平此 Excel 表格

问题描述

我有一个格式如下的 Excel 工作表:

enter image description here

而且我想以某种方式将此工作表更改/转换为每列一个数据项集项目的平面格式,因此...

malloc(3)

老实说,我不知道如何最好地完成此操作,因为最终我想要 json 格式的数据,但与此同时,我很乐意使用上述格式的数据。

有人可以建议如何最好地完成这项工作吗?

解决方法

您可以从 Python 或 VBA 或其他语言执行 SQL 语句,如下所示:

SELECT *
FROM (
    SELECT Question AS Item
    FROM [Sheet1$]

    UNION ALL SELECT 'Answer' + Answer
    FROM [Sheet1$]

    UNION ALL SELECT Answers
    FROM [Sheet1$]
) AS t1
WHERE Item IS NOT NULL

(虽然我不太清楚您想对 Correct Answer 列做什么。)

此外,检查结果是否按顺序返回可能很重要。


从 VBA(并假设是 Excel 主机),您可以使用如下代码来执行 SQL 语句,并将数据粘贴到新工作表中:

Const filepath As String = "C:\path\to\excel\file.xlsx"
Const sheetname As String = "Sheet1"

Dim connectionString As String
connectionString = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=""" & filepath & """;" & _
    "Extended Properties=""Excel 12.0;HDR=No"""

    ' If your data is in a macro-enabled file (.xlsm),the previous line should
    ' look like this:
    ' "Extended Properties=""Excel 12.0 Macro;HDR=No"""

Dim sql As String
sql = _
    "SELECT * " & _
    "FROM (" & _
        "SELECT Question AS Item " & _
        "FROM [Sheet1$] " & _
        "UNION ALL SELECT 'Answer' + Answer " & _
        "FROM [Sheet1$] " & _
        "UNION ALL SELECT Answers " & _
        "FROM [Sheet1$] " & _
    ") AS t1 " & _
    "WHERE Item IS NOT NULL"

Dim rs As New ADODB.Recordset
rs.Open sql,connectionString

Workbooks.Open(filepath).Worksheets.Add.Range("A1").CopyFromRecordset(rs)

你当然可以在 Python 中做类似的事情。


就 JSON 而言,VBA 没有原生 JSON 支持,但您可以从 VBA-JSON 导入模块。然后您可以按如下方式生成 JSON:

Dim json As String
json = JsonConverter.ConvertToJson(rs.GetRows)