Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Копирование столбцов из .xls и сохранение в файл
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Sun Oct 25, 2009 18:32    Post subject: Копирование столбцов из .xls и сохранение в файл Reply with quote

Есть ли возможность, не открывая .XLS файл, скопировать из него B, C, D, E столбцы и сохранить в текстовый файл, предварительно текстовый файл очистить.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1290

Post (Separately) Posted: Mon Oct 26, 2009 10:51    Post subject: Reply with quote

Мне по работе приходится довольно много работать с экселем похожим образом. Совсем не открывая не получится, все равно придется работать через объект 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
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Oct 26, 2009 12:02    Post subject: Reply with quote

Andrey_A
А почему нельзя открывать Excel?
Если писать на vbs, то Excel всё равно придёться открывать, хотя и в невидимом для пользователя режиме.
И зачем нужно автоматизировать операцию? Это так часто выполняется?

Если это всё же нужно, хотелось бы знать, сколько строк из этих столбцов необходимо сохранить? Критерием также может быть пустое значение в каком-либо столбце. Если так, то в каком? И как уже писал Loopback, не обговорен разделитель. Какой нужен?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Tue Oct 27, 2009 01:45    Post subject: Reply with quote

- Открытие Excel не принципиально, можно и открыть.
- Этот процесс просто необходимо автоматезировать
Я постоянно работаю над добавлением, изменением меню тотала Wcmd_Rus.mnu на свой лад, где каждая команда имеет свой значок, и прежде чем внести изменения в WCMICONS.INC, есть Wcmicons-inc.xls где всё прописывается (т.к. там сложный порядок нумерации), потом копируется колонки B, С, D, E
- Т.к. меню постоянно растёт и изменяется, я не могу казать до какой строки нужно копировать (сейчас это 2200 строка) - можно прописать в константу 2500...
- Т.к. из xls копируются в WCMICONS.INC только цифры, то разделитель не важен, даже можно наоборот убрать все лишние пробелы
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Mon Dec 14, 2009 03:36    Post subject: Reply with quote

Дополненительный вопрос по теме. Скрипт работает отлично, есть ли возможность в книге xls копировать информацию со второго листа. Что нужно поменять, убрать, добавить в скрипт?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Dec 14, 2009 17:23    Post subject: Reply with quote

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
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1290

Post (Separately) Posted: Mon Dec 14, 2009 19:16    Post subject: Reply with quote

Andrey_A wrote:
Дополненительный вопрос по теме. Скрипт работает отлично, есть ли возможность в книге xls копировать информацию со второго листа. Что нужно поменять, убрать, добавить в скрипт?

Надо перед вызовом функции чтения листа добавить строчку:
Code:

$nSheet = 2 ; номер листа
$oInFile.Sheets($nSheet).Select()
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Thu Dec 17, 2009 00:47    Post subject: Reply with quote

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
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Dec 17, 2009 10:24    Post subject: Reply with quote

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
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1290

Post (Separately) Posted: Thu Dec 17, 2009 11:22    Post subject: Reply with quote

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
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Thu Dec 17, 2009 17:18    Post subject: Reply with quote

Quote:
Кстати, а офис на этой машине точно установлен?

У меня Офис Портабл (запускается без установки), кстати наверно в этом ошибка. На висте какой-то Офис стоял, но я им не пользовался, (работал с Портабл версией),хотя он наверно и зарегистрировал что-то, что позволяло не возникать этой ошибке.

Кто-нибудь знает как нужно зарегистрировать (наверно в реестре) %COMMANDER_PATH%\Programs\Office_2007_Portable\Word_2007.exe
%COMMANDER_PATH%\Programs\Office_2007_Portable\Excel_2007.exe, чтобы вопросов не возникало.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1290

Post (Separately) Posted: Thu Dec 17, 2009 18:29    Post subject: Reply with quote

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
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Fri Dec 18, 2009 17:04    Post subject: Reply with quote

Ради интереса, что происходит в вашей portable версии когда вы жмёте Alt+F11 (вызов VBA редактора)?
Back to top
View user's profile Send private message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Fri Dec 18, 2009 20:05    Post subject: Reply with quote

У меня две Портабл версии 2003 и 2007
Ради интереса я нажал Alt+F11
В оба раза выскочил наверно редактор - Microsoft Visual Basic - а это нам как-то поможет в регистрации?
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 949
Location: Могилёв, Беларусь

Post (Separately) Posted: Sat Dec 19, 2009 00:14    Post subject: Reply with quote

Lev wrote:
Ради интереса, что происходит в вашей portable версии когда вы жмёте Alt+F11 (вызов VBA редактора)?

У меня portable Word+Excel+PowerPoint 2003, VBA внутри отлично работает.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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