none
Преобразование форматов файлов RRS feed

  • Вопрос

  • Добрый день.

    Есть задача долучить из HTM страницы документ XLS.
    Если просто взять эту страницу, сохранить на компьютере и переименовать файл из *.htm в *.xls, то Excel его открывает, но его формат - это "WEB-документ".
    Далее если сделать "Сохранить как", то можно сохранить как книгу Excel.

    Вот эту же процедуру надо автоматизировать.

    Логика этого действия заключается в том, что одна весьма спецефичная программа выдает отчеты только в HTM.
    а другая, не мение специфичная программа читает только XLS. И если ей дать просто переименованый файл, то она его не читает.

    поток данных - 150-200 файлов в день, и растет...
    да и файлы не маленькие (10000-15000 строк).
    пока в ручную откроеш/сохраниш/закроеш - можно вспотеть)

    Подскажите решение, желательно штатными средствами (аля BAT файл).

    Заранее благодарен.
    22 ноября 2009 г. 13:38

Ответы

  • у меня получилось так:


    $xlWorkbookNormal = -4143
    $Path2HTMLFiles="C:\Documents and Settings\Serg\Мои документы"
    $Path2XLSFiles="C:\Documents and Settings\Serg\Мои документы"
    $objHTMLFiles= dir $Path2HTMLFiles\*.htm
    $objExcel=New-Object -comobject Excel.Application
    foreach ($objFile in $objHTMLFiles) {
     $objWorkbook=$objExcel.Workbooks.Open($objFile.FullName)
     $NewFileName=$objFile.Name -replace ".htm",".xls"
     $objWorkbook.SaveAs("$Path2XLSFiles\$NewFileName",$xlWorkbookNormal)
     $objWorkbook.Close()
    }
    $objExcel.Quit()
    gps excel| stop-process

    Upd исправил ошибку в 4й строке

    • Предложено в качестве ответа Vasily GusevModerator 22 ноября 2009 г. 18:40
    • Помечено в качестве ответа Mirac 22 ноября 2009 г. 21:06
    22 ноября 2009 г. 18:25
  • похоже, что ответ кроется в региональных настройках

    Get-Culture показывает

    LCID Name DisplayName ---- ---- ----------- 1058 uk-UA Украинский (Украина)

    если установить формат как Русский (Россия)

    LCID             Name             DisplayName                                                                                                                                                 
    ----             ----             -----------                                                                                                                                                 
    1049             ru-RU            Русский (Россия)                                                                                                  
    

    то все работает как и должно...

    Windows и Office - используются локализованные русские версии

    • Предложено в качестве ответа Oleg Gritsun 26 февраля 2013 г. 11:26
    • Помечено в качестве ответа KazunEditor 26 февраля 2013 г. 11:30
    26 февраля 2013 г. 11:26

Все ответы

  • Попробуйте так (к сожалению проверить сейчас не могу):

    $excel = New-Object -com excel.application
    $book = $excel.Workbooks.OpenXML('C:\Temp\out.html')
    $book.SaveAs("C:\Temp\out.xls",1)
    $excel.DisplayAlerts = $false
    $excel.quit()

    Это PowerShell.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Mirac 22 ноября 2009 г. 21:06
    • Снята пометка об ответе Mirac 22 ноября 2009 г. 21:06
    22 ноября 2009 г. 18:04
    Модератор
  • у меня получилось так:


    $xlWorkbookNormal = -4143
    $Path2HTMLFiles="C:\Documents and Settings\Serg\Мои документы"
    $Path2XLSFiles="C:\Documents and Settings\Serg\Мои документы"
    $objHTMLFiles= dir $Path2HTMLFiles\*.htm
    $objExcel=New-Object -comobject Excel.Application
    foreach ($objFile in $objHTMLFiles) {
     $objWorkbook=$objExcel.Workbooks.Open($objFile.FullName)
     $NewFileName=$objFile.Name -replace ".htm",".xls"
     $objWorkbook.SaveAs("$Path2XLSFiles\$NewFileName",$xlWorkbookNormal)
     $objWorkbook.Close()
    }
    $objExcel.Quit()
    gps excel| stop-process

    Upd исправил ошибку в 4й строке

    • Предложено в качестве ответа Vasily GusevModerator 22 ноября 2009 г. 18:40
    • Помечено в качестве ответа Mirac 22 ноября 2009 г. 21:06
    22 ноября 2009 г. 18:25
  • Сделал так:

    $xlWorkbookNormal = -4143
    $Path2HTMLFiles="C:\Temp"
    $Path2XLSFiles="C:\Temp"
    $objHTMLFiles= dir $Path2HTMLFiles\*.htm
    $objExcel=New-Object -comobject Excel.Application
    $objHTMLFiles
    foreach ($objFile in $objHTMLFiles) {
     $objFile.Name
     $objWorkbook=$objExcel.Workbooks.Open($objFiles.FullName)
     $NewFileName=$objFile.Name -replace ".htm",".xls"
     $objWorkbook.SaveAs("$Path2XLSFiles\$NewFileName",$xlWorkbookNormal)
     $objWorkbook.Close()
    }
    $objExcel.Quit()
    gps excel| stop-process

    а в ответ гора ошибок...

    Исключение при вызове "Open" с "1" аргументами: "Использован старый формат, либо библиотека имеет неверный тип. (Исключение из HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
    строка:9 знак:39
    +  $objWorkbook=$objExcel.Workbooks.Open <<<< ($objFiles.FullName)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ComMethodTargetInvocation
     
    Нельзя вызвать метод для выражения со значением NULL.
    строка:11 знак:21
    +  $objWorkbook.SaveAs <<<< ("$Path2XLSFiles\$NewFileName",$xlWorkbookNormal)
        + CategoryInfo          : InvalidOperation: (SaveAs:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    Нельзя вызвать метод для выражения со значением NULL.
    строка:12 знак:20
    +  $objWorkbook.Close <<<< ()
        + CategoryInfo          : InvalidOperation: (Close:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    Everest_TRINITRON_2009-05-30.htm
    Исключение при вызове "Open" с "1" аргументами: "Использован старый формат, либо библиотека имеет неверный тип. (Исключение из HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
    строка:9 знак:39
    +  $objWorkbook=$objExcel.Workbooks.Open <<<< ($objFiles.FullName)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ComMethodTargetInvocation
     
    Нельзя вызвать метод для выражения со значением NULL.
    строка:11 знак:21
    +  $objWorkbook.SaveAs <<<< ("$Path2XLSFiles\$NewFileName",$xlWorkbookNormal)
        + CategoryInfo          : InvalidOperation: (SaveAs:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    Нельзя вызвать метод для выражения со значением NULL.
    строка:12 знак:20
    +  $objWorkbook.Close <<<< ()
        + CategoryInfo          : InvalidOperation: (Close:String) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    22 ноября 2009 г. 20:45
  • Было бы здорово если бы вы выложили небольшой пример html файла который пытаетесь сконвертировать. Если сможете сократить до пары десятков строк - можно и прямо сюда, текстом.

    Также попробуйте в коде shs заменить Open на OpenXml как в моём примере.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 ноября 2009 г. 21:02
    Модератор
  • Сори... все уже понял...
    просто у меня на компьютере стоит Windows 7 и Office 2007... вот и ошибки.
    проверил на Windows XP и Office 2003  - все работает...

    Всем спасибо!
    22 ноября 2009 г. 21:06
  • а может кто подскажет как еще можно сделать?
    просто уж больно долго оно это делает...
    а файл уходит больше 2х минут (они ж у меня длинные очень).

    еще раз заранее благодарен!
    22 ноября 2009 г. 22:05
  • а может кто подскажет как еще можно сделать?
    просто уж больно долго оно это делает...
    а файл уходит больше 2х минут (они ж у меня длинные очень).

    еще раз заранее благодарен!

    Ну, а при ручном открытии/сохранении сколько времени на один файл уходит?
    23 ноября 2009 г. 7:12
  • Аналогичная история с открытием книги xlsx - которая появляется периодически на некоторых машинах

    Исключение при вызове "Open" с "1" аргументами: "Использован старый формат, либо библиотека имеет неверный тип. (Исключение из HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

    перепробовал все, но в итоге помогло только вот это:

    Также попробуйте в коде shs заменить Open на OpenXml как в моём примере.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com

    понять не могу почему на всех машинах работает Open, а на моей новой машине только OpenXML помог

    везде установлены Windows 7 x64 и Office 2010 x64

    а дома установлены Windows 8 Pro x64 и Office 2013 Pro x64 и работает Open...

    где загвоздка?


    • Изменено Oleg Gritsun 26 февраля 2013 г. 9:50
    26 февраля 2013 г. 9:45
  • похоже, что ответ кроется в региональных настройках

    Get-Culture показывает

    LCID Name DisplayName ---- ---- ----------- 1058 uk-UA Украинский (Украина)

    если установить формат как Русский (Россия)

    LCID             Name             DisplayName                                                                                                                                                 
    ----             ----             -----------                                                                                                                                                 
    1049             ru-RU            Русский (Россия)                                                                                                  
    

    то все работает как и должно...

    Windows и Office - используются локализованные русские версии

    • Предложено в качестве ответа Oleg Gritsun 26 февраля 2013 г. 11:26
    • Помечено в качестве ответа KazunEditor 26 февраля 2013 г. 11:30
    26 февраля 2013 г. 11:26