View previous topic :: View next topic |
Author |
Message |
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Sun Oct 25, 2009 18:32 Post subject: Копирование столбцов из .xls и сохранение в файл |
|
|
Есть ли возможность, не открывая .XLS файл, скопировать из него B, C, D, E столбцы и сохранить в текстовый файл, предварительно текстовый файл очистить. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Mon Oct 26, 2009 10:51 Post subject: |
|
|
Мне по работе приходится довольно много работать с экселем похожим образом. Совсем не открывая не получится, все равно придется работать через объект Excel. Но можно делать это в скрытом виде.
Вот пример на Autoit, c использованием библиотеки ExcelCOM. Библиотеку можно скачать здесь. Ее нужно положить в один каталог со скриптом.
Сам скрипт:
Code: |
#include <Excel.au3>
$sFile = @ScriptDir & "\filename.xls"
; Откроем книгу
$oInFile = _ExcelBookOpen($sFile, 0, True)
; Прочитаеи 4 колонки, начиная со второй (B), строки читаем все
$aData = _ExcelReadSheetToArray($oInFile, 1, 2, 0, 4)
; Закроем книгу
_ExcelBookClose($oInFile, 0)
; Откроем выходной файл для записи - с очисткой
$hFile = FileOpen("output.txt", 2)
; Запишем данные
For $i=1 To $aData[0][0]
FileWriteLine($hFile, StringFormat("%s\t%s\t%s\t%s", $aData[$i][1], $aData[$i][2], $aData[$i][3], $aData[$i][4]))
Next
FileClose($hFile)
|
Формат вывода, т.к. не был обговорен, сделал с разделением табуляцией. Но разумеется, можно как угодно. Файл задан в переменной $sFile, если нужно получать параметр из командной строки, то нужно заменить эту строку на пару таких:
Code: |
If $CmdLine[0] = 0 Then Exit
$sFile = $CmdLine[1]
|
|
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Oct 26, 2009 12:02 Post subject: |
|
|
Andrey_A
А почему нельзя открывать Excel?
Если писать на vbs, то Excel всё равно придёться открывать, хотя и в невидимом для пользователя режиме.
И зачем нужно автоматизировать операцию? Это так часто выполняется?
Если это всё же нужно, хотелось бы знать, сколько строк из этих столбцов необходимо сохранить? Критерием также может быть пустое значение в каком-либо столбце. Если так, то в каком? И как уже писал Loopback, не обговорен разделитель. Какой нужен? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Oct 27, 2009 01:45 Post subject: |
|
|
- Открытие Excel не принципиально, можно и открыть.
- Этот процесс просто необходимо автоматезировать
Я постоянно работаю над добавлением, изменением меню тотала Wcmd_Rus.mnu на свой лад, где каждая команда имеет свой значок, и прежде чем внести изменения в WCMICONS.INC, есть Wcmicons-inc.xls где всё прописывается (т.к. там сложный порядок нумерации), потом копируется колонки B, С, D, E
- Т.к. меню постоянно растёт и изменяется, я не могу казать до какой строки нужно копировать (сейчас это 2200 строка) - можно прописать в константу 2500...
- Т.к. из xls копируются в WCMICONS.INC только цифры, то разделитель не важен, даже можно наоборот убрать все лишние пробелы |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Mon Dec 14, 2009 03:36 Post subject: |
|
|
Дополненительный вопрос по теме. Скрипт работает отлично, есть ли возможность в книге xls копировать информацию со второго листа. Что нужно поменять, убрать, добавить в скрипт? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Dec 14, 2009 17:23 Post subject: |
|
|
Andrey_A
Недавно пришлось делать для себя нечто похожее.
После дорабатывания под твою задачу получился следующий vbs:
Code: | '=============================================================
' Создание txt-файла из xls-файла
' Параметры скрипта:
' {excel-файл} {txt-файл}
'=============================================================
Option Explicit
'=============== Изменяемые параметры ========================
Const ReplNewLine = "|" 'Символ для замены переносов строк
Const SheetName = "Test" 'Имя листа для сохранения
'=============================================================
Dim FSO, XlsFile, objXL, TxtFile
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objXL = CreateObject("Excel.Application")
CheckParams
On Error Resume Next
objXL.DisplayAlerts = False
objXL.Workbooks.Open XlsFile
If Err.Number > 0 Then Quit
Main
If Err.Number > 0 Then MsgBox Err.Description, 0, "Xls2Txt"
On Error Goto 0
objXL.Quit()
WScript.Sleep 1000
On Error Resume Next
ReplInTxtFile
On Error Goto 0
Quit
'===== Процедуры и функции ===================================
'Основная процедура
Sub Main
'Переходим на нужный лист
objXL.Sheets(SheetName).Select
'Убираем лишние данные
objXL.Range("A1", "A65536" ).Delete
objXL.Range("E1", "IV65536").Delete
'Заменяем переносы строк в ячейках
objXL.Range("A1", "IV65536").Replace Chr(10), ReplNewLine
objXL.Range("A1", "IV65536").Replace Chr(13), ReplNewLine
objXL.Range("A1", "IV65536").Replace ReplNewLine & ReplNewLine, ReplNewLine
If FSO.FileExists(TxtFile) Then FSO.DeleteFile TxtFile, True
'Сохранение результатов
objXL.Application.ActiveWorkbook.SaveAs TxtFile, -4158
End Sub
'Дополнительная обработка итогового txt-файла
Sub ReplInTxtFile
Dim lText
lText = FSO.OpenTextFile(TxtFile).ReadAll
lText = Replace(lText, ReplNewLine & vbTab, vbTab)
FSO.OpenTextFile(TxtFile, 2).Write lText
End Sub
'Проверка входных параметров
Sub CheckParams
With WScript
If .Arguments.Count < 2 Then Quit
XlsFile = .Arguments(0)
If Not FSO.FileExists(XlsFile) Then Quit
TxtFile = .Arguments(1)
End With
End Sub
'Выход
Sub Quit
Set objXL = Nothing
Set FSO = Nothing
WScript.Quit
End Sub |
Мне для своей задачи нужно было еще удалить переносы строк в ячейках. Здесть тоже оставил, иначе строчки поедут. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Mon Dec 14, 2009 19:16 Post subject: |
|
|
Andrey_A wrote: | Дополненительный вопрос по теме. Скрипт работает отлично, есть ли возможность в книге xls копировать информацию со второго листа. Что нужно поменять, убрать, добавить в скрипт? |
Надо перед вызовом функции чтения листа добавить строчку:
Code: |
$nSheet = 2 ; номер листа
$oInFile.Sheets($nSheet).Select()
|
|
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Thu Dec 17, 2009 00:47 Post subject: |
|
|
Loopback пожалуйста напиши весь скрипт код заново
Задача: Со второго листа записать в файл один столбец В
(куда бы я не вставлял вышеописанную строчку ничего не получается)
Кстати Я работал на Висте скрипт Xls_in_txt.au3 работал,перешёл на Xp стал выдавать ошибку Code: | Line 16 (File "C:\Total Commander\Xls_in_txt.au3"):
For $i=1 To $aData[0][0]
For $i=1 To $aData^ ERROR
Error: Subscript used with non-Array variable. |
Что это может значить? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Thu Dec 17, 2009 10:24 Post subject: |
|
|
Andrey_A wrote: | Задача: Со второго листа записать в файл один столбец В |
Если всё же решишь использовать vbs, то надо поменять
Code: | 'Убираем лишние данные
objXL.Range("A1", "A65536" ).Delete
objXL.Range("E1", "IV65536").Delete |
на
Code: | 'Убираем лишние данные
objXL.Range("A1", "A65536" ).Delete
objXL.Range("B1", "IV65536").Delete |
_________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Thu Dec 17, 2009 11:22 Post subject: |
|
|
Andrey_A wrote: | Loopback пожалуйста напиши весь скрипт код заново
Задача: Со второго листа записать в файл один столбец В
(куда бы я не вставлял вышеописанную строчку ничего не получается) |
Кажется нашел проблему. Индексы при обращении к листу лучше не использовать, т.к. при попытке активации скрытого листа вываливается ошибка. Лучше использовать имя листа.
Code: |
#include <Excel.au3>
$sFile = @ScriptDir & "\filename.xls"
; Откроем книгу
$oInFile = _ExcelBookOpen($sFile, 0, True)
; Активируем лист
_ExcelSheetActivate($oInFile, "<имя листа>")
; Прочитаеи колонку B, строки читаем все
$aData = _ExcelReadSheetToArray($oInFile, 1, 2, 0, 1)
; MsgBox(0, "Error code:", "Error: " & @error & " Extended: " & @extended) ; TEST
; Закроем книгу
_ExcelBookClose($oInFile, 0)
; Откроем выходной файл для записи - с очисткой
$hFile = FileOpen("output.txt", 2)
; Запишем данные
For $i=1 To $aData[0][0]
FileWriteLine($hFile, $aData[$i][1])
Next
FileClose($hFile)
|
Andrey_A wrote: | Кстати Я работал на Висте скрипт Xls_in_txt.au3 работал,перешёл на Xp стал выдавать ошибку |
Странно, судя по всему, функции ExcelReadSheetToArray не удается прочитать данные. Попробуй раскомментировать строчку в скрипте выше, помеченную TEST, и посмотреть, какая ошибка выдается. Кстати, а офис на этой машине точно установлен? |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Thu Dec 17, 2009 17:18 Post subject: |
|
|
Quote: | Кстати, а офис на этой машине точно установлен? |
У меня Офис Портабл (запускается без установки), кстати наверно в этом ошибка. На висте какой-то Офис стоял, но я им не пользовался, (работал с Портабл версией),хотя он наверно и зарегистрировал что-то, что позволяло не возникать этой ошибке.
Кто-нибудь знает как нужно зарегистрировать (наверно в реестре) %COMMANDER_PATH%\Programs\Office_2007_Portable\Word_2007.exe
%COMMANDER_PATH%\Programs\Office_2007_Portable\Excel_2007.exe, чтобы вопросов не возникало. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1290
|
(Separately) Posted: Thu Dec 17, 2009 18:29 Post subject: |
|
|
Andrey_A wrote: | У меня Офис Портабл (запускается без установки), кстати наверно в этом ошибка. На висте какой-то Офис стоял, но я им не пользовался, (работал с Портабл версией),хотя он наверно и зарегистрировал что-то, что позволяло не возникать этой ошибке. |
Ну тогда проблема точно в этом. Весь скриптинг работает через объект экселя.
Andrey_A wrote: | Кто-нибудь знает как нужно зарегистрировать (наверно в реестре) %COMMANDER_PATH%\Programs\Office_2007_Portable\Word_2007.exe
%COMMANDER_PATH%\Programs\Office_2007_Portable\Excel_2007.exe, чтобы вопросов не возникало. |
Предполагаю, это должна быть какая-то dll или ocx, регистрируемая regsvr32. Но какая точно не знаю. |
|
Back to top |
|
|
Lev
Joined: 02 Mar 2005 Posts: 392
|
(Separately) Posted: Fri Dec 18, 2009 17:04 Post subject: |
|
|
Ради интереса, что происходит в вашей portable версии когда вы жмёте Alt+F11 (вызов VBA редактора)? |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Fri Dec 18, 2009 20:05 Post subject: |
|
|
У меня две Портабл версии 2003 и 2007
Ради интереса я нажал Alt+F11
В оба раза выскочил наверно редактор - Microsoft Visual Basic - а это нам как-то поможет в регистрации? |
|
Back to top |
|
|
Rodny
Joined: 24 Jan 2007 Posts: 949 Location: Могилёв, Беларусь
|
(Separately) Posted: Sat Dec 19, 2009 00:14 Post subject: |
|
|
Lev wrote: | Ради интереса, что происходит в вашей portable версии когда вы жмёте Alt+F11 (вызов VBA редактора)? |
У меня portable Word+Excel+PowerPoint 2003, VBA внутри отлично работает. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|