iT邦幫忙

0

資料夾裡excel檔案全部轉檔

  • 分享至 

  • xImage

如題,假設我資料夾的都是excel並且每個excel都有檔案格式與副檔名不相符的問題
可以靠這個方法解決
https://tw.imyfone.com/windows-data-recovery/excel-cannot-open-file/
但是由於檔案太多一個一個轉有點慢,所以想問其他更好方法可以直接將整個資料夾轉檔嗎

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
小山丘
iT邦新手 2 級 ‧ 2021-12-21 14:15:01
最佳解答

你是要更改副檔名嗎?
這篇看看

rename *.xlsx *.你要更改的副檔名

08大提供的方法:
1.打開我的電腦上面路徑那直接打PowerShell
2.

$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
write-host $xlFixedFormat
$excel = New-Object -ComObject excel.application
$excel.visible = $true
$folderpath = "C:\Users\gabceb\Documents\testXLS"
$filetype ="*xls"
Get-ChildItem -Path $folderpath -Include $filetype -recurse |
ForEach-Object `
{
$path = ($.fullname).substring(0, ($.FullName).lastindexOf("."))

"Converting $path"
$workbook = $excel.workbooks.open($_.fullname)

$path += ".xlsx"
$workbook.saveas($path, $xlFixedFormat)
$workbook.close()

$oldFolder = $path.substring(0, $path.lastIndexOf("\")) + "\old"

write-host $oldFolder
if(-not (test-path $oldFolder))
{
	new-item $oldFolder -type directory
}

move-item $_.fullname $oldFolder
}
$excel.Quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

這段程式碼
$folderpath的地方改成你的資料夾

我沒用admin的權限就可以成功了,如果失敗可以用系統管理員身份執行看看

看更多先前的回應...收起先前的回應...
ragequit iT邦新手 5 級 ‧ 2021-12-21 14:20:24 檢舉

試過沒辦法 可能本身就excel就已經檔案格式與副檔名不相符的問題,所以再改副檔名也仍然會出現

小山丘 iT邦新手 2 級 ‧ 2021-12-21 14:35:16 檢舉

什麼意思,你現在那個資料夾裡面的副檔名都是什麼呢

試試用 PowerShell
ConvertXLS

小山丘 iT邦新手 2 級 ‧ 2021-12-21 14:42:27 檢舉
ragequit iT邦新手 5 級 ‧ 2021-12-21 14:55:02 檢舉

因為拿到的檔案已經是強轉過後的檔案,但無法追朔回原始檔。
目前是能開啟強轉過後的檔案存在檔案格式與副檔名不相符問題,但還能開啟excel。
但如果要讓開啟時檔案不會跳出檔案存在檔案格式與副檔名不相符的警示窗,只能打開後另存新檔

ragequit iT邦新手 5 級 ‧ 2021-12-21 14:55:20 檢舉

所以不能直接改檔名
目前檔案名稱是xls,但我另存成xlsx就正常了
但我想做的是把資料夾所有檔案都這樣操作過一次

上面 PowerShell 的程式碼就是在做你說的動作哦,記得要用 admin 的權限打開 ps

小山丘 iT邦新手 2 級 ‧ 2021-12-21 15:03:30 檢舉

用08大的那個方式吧,那個就是重新存檔了

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:05:40 檢舉

好我研究一下,我沒使用過ps QQ

小山丘 iT邦新手 2 級 ‧ 2021-12-21 15:09:27 檢舉

1.打開我的電腦上面路徑那直接打PowerShell
2.$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
write-host $xlFixedFormat
$excel = New-Object -ComObject excel.application
$excel.visible = $true
$folderpath = "C:\Users\gabceb\Documents\testXLS"
$filetype ="*xls"
Get-ChildItem -Path $folderpath -Include $filetype -recurse |
ForEach-Object `
{
$path = ($.fullname).substring(0, ($.FullName).lastindexOf("."))

"Converting $path"
$workbook = $excel.workbooks.open($_.fullname)

$path += ".xlsx"
$workbook.saveas($path, $xlFixedFormat)
$workbook.close()

$oldFolder = $path.substring(0, $path.lastIndexOf("\")) + "\old"

write-host $oldFolder
if(-not (test-path $oldFolder))
{
	new-item $oldFolder -type directory
}

move-item $_.fullname $oldFolder

}
$excel.Quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()
這段程式碼
$folderpath的地方改成你的資料夾

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:19:42 檢舉

ps能正常運行了,但是產生的old的檔案卻還是xls,我但原始文件應該是會轉成xlsx 而且還是有跳出警示窗

old 檔是舊檔哦,新的會在目錄底下,沒有檔案代表沒有執行成功,我想應該是會跳出警告視窗導致的

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:22:38 檢舉

喔沒事,我搞錯了old是舊的檔案,新的她保留在原位置上
能正常運作了,感謝兩位大大

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:29:34 檢舉

題外話想問一下兩位大大,$path += ".xlsx" 改成 $path += ".xls" 會噴出無法取得類別 Workbook 的 SaveAs 屬性的問題
有辦法讓他另存.xls嗎

小山丘 iT邦新手 2 級 ‧ 2021-12-21 15:41:58 檢舉

$filetype ="*xls"
這裡有先改xlsx嗎?

我執行是正常的

ragequit iT邦新手 5 級 ‧ 2021-12-22 08:05:51 檢舉

抱歉,昨天回應達到系統上限,我指的是xls另存為xls這樣,$filetype ="xls"我應該不需要更改成xlsx
所以這兩行如果都這樣執行
$filetype ="xls"
$path += ".xls"
會噴這個錯"無法取得類別 Workbook 的 SaveAs 屬性"

ragequit 改成用 $workbook.save() 然後 move-item 那行移除或註解掉

ragequit iT邦新手 5 級 ‧ 2021-12-22 14:36:53 檢舉

$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
write-host $xlFixedFormat
$excel = New-Object -ComObject excel.application
$excel.visible = $true
$folderpath = "C:\Users\x11\拋資料
$filetype ="*xls"
Get-ChildItem -Path $folderpath -Include $filetype -recurse |
ForEach-Object `
{
$path = ($.fullname).substring(0, ($.FullName).lastindexOf("."))

"Converting $path"
$workbook = $excel.workbooks.open($_.fullname)

$path += ".xlsx"
$workbook.save($path, $xlFixedFormat)
$workbook.close()

$oldFolder = $path.substring(0, $path.lastIndexOf("\")) + "\old"

write-host $oldFolder
if(-not (test-path $oldFolder))
{
	new-item $oldFolder -type directory
}

}

$excel.Quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

ragequit iT邦新手 5 級 ‧ 2021-12-22 14:37:18 檢舉

找不到 "Save" 的超載,引數計數為: "2"
位於 線路:16 字元:5

  • $workbook.save($path, $xlFixedFormat)
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : NotSpecified: (:) [], MethodException
    • FullyQualifiedErrorId : RuntimeException
ragequit iT邦新手 5 級 ‧ 2021-12-22 14:37:48 檢舉

改成 L大所說 會噴上面那個錯

ragequit
我上面的範例沒有帶參數,把參數移除

ragequit iT邦新手 5 級 ‧ 2021-12-23 09:12:24 檢舉

感謝L大~

2
尼克
iT邦大師 1 級 ‧ 2021-12-21 14:40:53
看更多先前的回應...收起先前的回應...
ragequit iT邦新手 5 級 ‧ 2021-12-21 14:57:40 檢舉

目前只單純修改檔名或是附檔名仍然會有錯誤

尼克 iT邦大師 1 級 ‧ 2021-12-21 15:04:09 檢舉

有出現任何錯誤訊息嗎?

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:08:02 檢舉

改檔名前和改檔名後都是出現 檔案格式與副檔名不相符 的警告視窗

ragequit iT邦新手 5 級 ‧ 2021-12-21 15:23:27 檢舉

目前已經解決的

我要發表回答

立即登入回答