Excel格式转换摘抄自 阿丙的博客园 链接请点击
文件夹内存在大量的xls文件,用pandas的read_excel 读取的时候,报错: “struct.error: unpack requires a bytes object of length 2”,尝试通过 read_excel(open(file,‘rb’,encoding=“gbk”)) 换了多种编码格式无果。
open(path) 得到如下输出:
<_io.TextIOWrapper name=‘F://数据//ceshi.xls’ mode=‘r’ encoding=‘cp936’>
通过以下链接得知问题源于旧有的excel版本文件,可将文件格式替换为xlsx格式即可,亲测成功http://www.itkeyword.com/doc/289515404364052x169/python-pandas-cannot-read-old-excel-files-with-some-strange-encoding-and-split-p
不过文件众多,批量改名并不能达到修改文件格式的目的,通过VB可以实现。
执行条件:
工具下载:
可以自己新建Excel
功能介绍:
后面有相应的代码
《xls2xlsx.xlsm》会在所在文件夹目录中、包括子目录中,遍历所有.xls格式的文件,执行“另存为”操作,然后在原文件当前位置另存为一个同名的.xlsx格式的文件。
比如:执行前xls2xlsx.xlsm所在的文件夹中有3个.xls格式的文件,同时包含一个子文件夹,子文件夹中也有3个.xls格式的文件
《Convert2xlsx.xlsm》会在所在文件夹目录中(不包括子目录),遍历所有.xls格式的文件,执行“另存为”操作,然后在当前路径下生成一个文件夹xlsx,这个文件夹中放了所有新生成的文件。
比如:执行前Convert2xlsx.xlsm所在的文件夹中有3个.xls格式的文件
执行方法:
1、新建一个Excel;
2、启用宏操作
一般情况下,打开Excel的时候,会弹出如下警告,如果弹出了这个警告,直接启用就可以了;如果没有出现的话,请参考以下百度经验启用宏http://jingyan.baidu.com/article/39810a23e39b9db637fda651.html
3、编写执行VBA代码
这一步新手肯定是不会的,详细地图文介绍就参考百度经验http://jingyan.baidu.com/article/09ea3ede265e8bc0aede39ba.html,我这里只作简单的说明:
(a)在工作表界面按下组合快捷键Alt+F11或者右键单击任意一个工作表标签,在弹出的右键快捷菜单单击“查看代码”进入VBA编辑环境
(b)如果是下载的我的工具,可以跳过此步骤;如果是新建的Excel,此时在VBA编辑环境中的“代码窗口”复制粘贴以下两个代码中的一个:
《xls2xlsx.xlsm》
Dim iFile(1 To 100000) As String
Dim count As Integer
Sub xls2xlsx()
iPath = ThisWorkbook.Path
On Error Resume Next
count = 0
zdir iPath
For i = 1 To count
If iFile(i) Like "*.xls" And iFile(i) <> ThisWorkbook.FullName Then
MyFile = iFile(i)
FilePath = Replace(MyFile, ".xls", ".xlsx")
If Dir(FilePath, 16) = Empty Then
Set WBookOther = Workbooks.Open(MyFile)
Application.ScreenUpdating = False
ActiveWorkbook.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
WBookOther.Close SaveChanges:=False '解决不能close 文件问题
Application.ScreenUpdating = True
End If
End If
Next
End Sub
Sub zdir(p) '访问当前文件夹下所有子文件夹及文件
Set fs = CreateObject("scripting.filesystemobject")
For Each f In fs.GetFolder(p).Files
If f <> ThisWorkbook.FullName Then count = count + 1: iFile(count) = f
Next
For Each m In fs.GetFolder(p).SubFolders
zdir m
Next
End Sub
《Convert2xlsx.xlsm》
Sub xls2xlsx()
Dim FilePath, MyFile, iPath, Name, OutPath As String
iPath = ThisWorkbook.Path
OutPath = Dir(iPath & "\xlsx", vbDirectory)
If OutPath = "" Then
MkDir (iPath & "\xlsx")
End If
MyFile = Dir(iPath & "\*.xls")
If MyFile <> "" Then
Do
On Error Resume Next
If MyFile = ThisWorkbook.Name Then MyFile = Dir
Workbooks.Open (iPath & "\" & MyFile)
MyFile = Replace(MyFile, ".xls", ".xlsx")
Name = "\" & MyFile
FilePath = iPath & "\xlsx" & Name
Application.ScreenUpdating = False
ActiveWorkbook.SaveAs Filename:=FilePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Workbooks(MyFile).Close True
Application.ScreenUpdating = True
MyFile = Dir
Loop While MyFile <> ""
End If
End Sub
©按下F5快捷键执行这段代码或者在菜单中单击“运行子过程/用户窗体”命令
PS:需要说明的是,在执行过程中,不要去做其他的事情,不然可能会中断程序的运行
过程中可能遇到的问题
宏功能启用:链接
excel点击 vb,内存溢出
将VBA6里的VBE6EXT.OLB复制到VBA7,VBA7里的VBE7.DLL复制到VBA6,再次打开office就不会出现了
VBE7.DLL所在目录:C:\Program Files\Common Files\microsoft shared\VBA\VBA7(可能会有差异,如果是VBA7.1,则是7.1)
VBE6EXT.OLB所在目录: C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6,复制过来粘贴即可