批量修复 Excel 97-2003 错误“格式与扩展名不匹配”

Lor*_*ien 7 csv save-as microsoft-excel

语境

我收到了大约 1700 个 97-2003 年的 Excel 文件,其中包含大量数据,包括一些文本信息。在清理和运行一些统计分析之前,我试图将它们全部读入 Stata。但是,Stata 无法打开它们。这些文件采用 .xls 格式,其中包含我想要保留的大量文本,并将它们转换为 .csv 文件(因此是 csv 标签)。

我尝试过的

  • 仔细一看,每次我在 Excel 中手动打开文件时,都会收到错误“格式与扩展名不匹配”,我必须单击“仍然打开”并手动保存它,然后才能将文件导入到 Stata 中。我不可能对 1700 个文件执行此操作。我使用的是 Windows 操作系统,所有文件都保存在本地驱动器上。

我还尝试在 stata 上编写大量代码,将所有文件保存为 csv 或至少一个可以导入到 stata 中的 xls,但我的运气为零。每次我尝试保存它们时,我都会收到损坏的 csv 或 xls,其错误与 stata 上弹出的“尝试 xlCreateBook()”完全相同,并且当我手动尝试打开文件时出现“格式与扩展名不匹配”错误。

作为参考,下面是我写的stata代码。

cd "$dropbox\project8\data\2008-2009\A.Monthwise\dakota"
local oldfiles : dir "." files "*.xls" , respectcase
mac list _oldfiles

foreach fn of local oldfiles {
  local oldfn `"`fn'"'
  local res = ustrregexm(`"`oldfn'"', "_(.*)\.xls", .)
  if `res'==1 {
    local newfn = "new_" + ustrregexs(1) + ".dta"
    di `"Renaming `oldfn' to `newfn'"'
    copy `"./`oldfn'"' `"./new/`newfn'"', public
     }
} 
Run Code Online (Sandbox Code Playgroud)

问题

有没有办法解决 1700 个文件的扩展/格式问题并批量转换所有内容,以便 Stata 可以读取它?

har*_*ymc 15

错误“格式与扩展名不匹配”意味着文件不是真正的.xls. 由于 Excel 仍然可以打开它们,因此它们可能是受支持的另一种格式。我的猜测是.xlsx

您可以使用十六进制编辑器(例如 HxD)检查文件签名进行测试,该签名位于前几个字节中:

  • xlsx: 前 4 个字节是50 4B 03 04

  • xls: 前 8 个字节是D0 CF 11 E0 A1 B1 1A E1

要一次重命名当前文件夹中的所有文件,您可以使用命令提示符 (CMD) 和以下命令:

ren *.xls *.xlsx
Run Code Online (Sandbox Code Playgroud)

如果您的文件签名不是上述之一,请将其添加到您的帖子中。它将有助于识别这些文件。


由于文件是 HTML,而不是 xsl 甚至 xslx,因此可以使用 VBA 在 Excel 中进行批量转换。

文章 如何在 Excel 中将多个 xls 文件转换为 xlsx 文件? 包含适用于海报的脚本:

Sub ConvertToXlsx()
'Updateby Extendoffice
Dim strPath As String
Dim strFile As String
Dim xWbk As Workbook
Dim xSFD, xRFD As FileDialog
Dim xSPath As String
Dim xRPath As String
Set xSFD = Application.FileDialog(msoFileDialogFolderPicker)
With xSFD
.Title = "Please select the folder contains the xls files:"
.InitialFileName = "C:\"
End With
If xSFD.Show <> -1 Then Exit Sub
xSPath = xSFD.SelectedItems.Item(1)
Set xRFD = Application.FileDialog(msoFileDialogFolderPicker)
With xRFD
.Title = "Please select a folder for outputting the new files:"
.InitialFileName = "C:\"
End With
If xRFD.Show <> -1 Then Exit Sub
xRPath = xRFD.SelectedItems.Item(1) & "\"
strPath = xSPath & "\"
strFile = Dir(strPath & "*.xls")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Do While strFile <> ""
If Right(strFile, 3) = "xls" Then
Set xWbk = Workbooks.Open(Filename:=strPath & strFile)
xWbk.SaveAs Filename:=xRPath & strFile & "x", _
FileFormat:=xlOpenXMLWorkbook
xWbk.Close SaveChanges:=False
End If
strFile = Dir
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 不要在我的答案中重命名 - 这些文件不是 xlsx。您找到的文件签名是 HTML1 文件的签名!这变得很奇怪。您可以在线发布这些文件之一(Dropbox、OneDrive 等)吗?您还可以询问这些文件的提供者它们是如何生成的吗? (4认同)
  • 这些是真正的 HTML 文件。将扩展名重命名为“.html”可让 Excel 在不发出警告的情况下打开它。尝试将一个文件手动重命名为“.html”并测试是否可以在工作流程中使用它。如果它有效,那么“ren *.xls *.html”应该可以完成这项工作。不要使用 PowerShell,使用 CMD。 (2认同)

Saa*_*kke 7

由于这些文件似乎是 HTML 文件(在我看来,这是一种存储数据的疯狂方式),因此您可以研究可以抓取/解析网页的方法。

斯塔塔

我没有 Stata 可以玩,但找到了一个readhtml包,它有一个readhtmltable似乎可以读取网页上的表格的功能(不确定它是否可以处理本地 HTML 文件)。

Python

或者,我确实可以访问 Python 和pandas,它有一个read_html方法。我用您上传的文件F - A & N Islands_September.xls进行了尝试,效果相当不错。

为此,您需要python 环境中的lxml和软件包。pandas

import pandas as pd 
# This reads in the 'xls' file (which is actually HTML)
df = pd.read_html(r"c:\path\to\F - A & N Islands_September.xls")
# The result is a list with length one, so get the actual DataFrame with
df = df[0]
# Show the first few rows:
df.head()
Run Code Online (Sandbox Code Playgroud)
                  Unnamed: 0_level_0 Unnamed: 1_level_0                                                   Unnamed: 2_level_0 Unnamed: 3_level_0       District                                               
                  Unnamed: 0_level_1 Unnamed: 1_level_1                                                   Unnamed: 2_level_1 Unnamed: 3_level_1 _A & N Islands Nicobar North and Middle Andaman South Andaman
0  M1 [Ante Natal Care Services ANC]                1.1                    Total number of pregnant women Registered for ANC              TOTAL            NaN     NaN                      NaN           NaN
1  M1 [Ante Natal Care Services ANC]              1.1.1  Of which Number registered within first trimester (within 12 weeks)              TOTAL            NaN     NaN                      NaN           NaN
2  M1 [Ante Natal Care Services ANC]                1.2                        Number of Pregnant women registered under JSY              TOTAL            NaN     NaN                      NaN           NaN
3  M1 [Ante Natal Care Services ANC]                1.3   Number of pregnant women received 3 ANC check ups during pregnancy              TOTAL            NaN     NaN                      NaN           NaN
4  M1 [Ante Natal Care Services ANC]              1.4.1          Number of pregnant women given TT1 during current pregnancy              TOTAL            NaN     NaN                      NaN           NaN
Run Code Online (Sandbox Code Playgroud)

要将文件批量转换为 CSV,您可以执行以下操作:

                  Unnamed: 0_level_0 Unnamed: 1_level_0                                                   Unnamed: 2_level_0 Unnamed: 3_level_0       District                                               
                  Unnamed: 0_level_1 Unnamed: 1_level_1                                                   Unnamed: 2_level_1 Unnamed: 3_level_1 _A & N Islands Nicobar North and Middle Andaman South Andaman
0  M1 [Ante Natal Care Services ANC]                1.1                    Total number of pregnant women Registered for ANC              TOTAL            NaN     NaN                      NaN           NaN
1  M1 [Ante Natal Care Services ANC]              1.1.1  Of which Number registered within first trimester (within 12 weeks)              TOTAL            NaN     NaN                      NaN           NaN
2  M1 [Ante Natal Care Services ANC]                1.2                        Number of Pregnant women registered under JSY              TOTAL            NaN     NaN                      NaN           NaN
3  M1 [Ante Natal Care Services ANC]                1.3   Number of pregnant women received 3 ANC check ups during pregnancy              TOTAL            NaN     NaN                      NaN           NaN
4  M1 [Ante Natal Care Services ANC]              1.4.1          Number of pregnant women given TT1 during current pregnancy              TOTAL            NaN     NaN                      NaN           NaN
Run Code Online (Sandbox Code Playgroud)