Excel Workbook Copy To
Posted: 08 Oct 2020, 18:39
I have a few different CSV files I want to merge into a single Excel Workbook, with the contents of each CSV file on a separate WorkSheet.
Any ideas?
Any ideas?
Let's help each other out
https://www.autohotkey.com/boards/
https://www.autohotkey.com/boards/viewtopic.php?f=76&t=81912
Code: Select all
csv1 := "D:\test1.CSV"
csv2 := "D:\test2.CSV"
csv3 := "D:\test3.CSV"
CsvArr := [csv1, csv2, csv3]
outFilePath := A_ScriptDir . "\MyBook.xlsx"
Excel := ComObjCreate("Excel.Application")
XLBook := Excel.Workbooks.Add
for k, csvFile in CsvArr {
FileData := GetCsvFileData(csvFile)
IdentifyCodePage(FileData)
IdentifyDelimiter(FileData)
FileData.XLSht := k = 1 ? XLBook.ActiveSheet : XLBook.Worksheets.Add(, PrevSht)
PrevSht := FileData.XLSht
LoadDataFromCsv(FileData)
}
XLBook.SaveAs(outFilePath, xlWorkbookDefault := 51)
XLBook.Close(true, outFilePath)
DetectHiddenWindows, On
WinClose, % "ahk_id" . Excel.hwnd
Return
GetCsvFileData(csvFilePath) {
Data := {}
File := FileOpen(csvFilePath, "r")
Data.text := File.Read()
Data.codepage := File.Encoding
File.Close()
Data.filePath := csvFilePath
Return Data
}
IdentifyCodePage(Info) {
codePage := Info.codePage
RegExMatch(codePage, "i)^(utf-|cp)(\d+)$", cp)
codePage := ""
if (cp = "")
codePage := 1251
else if (cp1 = "cp")
codePage := cp2
else {
if (cp2 = 8)
codePage := 65001
else if (cp2 = 16)
codePage := 1200
}
(codePage = "" && codePage := 1251)
if ( codePage = 1251 && RegExMatch(Info.text, "Ў|Ђ|ћ|џ") )
codePage := 65001
Info.codePage := codePage
}
IdentifyDelimiter(Info) {
text := RegExReplace(Info.text, """[^""]+""")
StrReplace(text, ",", "", commaCount)
StrReplace(text, ";", "", semicolonCount)
ObjDelete(Info, "text")
Info.delimiter := commaCount > semicolonCount ? "," : ";"
}
LoadDataFromCsv(Info) {
Tbl := Info.XLSht.QueryTables.Add("TEXT;" . Info.filePath, Info.XLSht.Range("A1"))
Tbl.PreserveFormatting := true
Tbl.RefreshOnFileOpen := false
Tbl.RefreshStyle := xlInsertDeleteCells := 1
Tbl.AdjustColumnWidth := true
Tbl.RefreshPeriod := 0
Tbl.TextFilePlatform := Info.codePage
Tbl.TextFileStartRow := 1
Tbl.TextFileParseType := xlDelimited := 1
Tbl.TextFileTextQualifier := xlTextQualifierDoubleQuote := 1
Tbl.TextFileConsecutiveDelimiter := false
Tbl.TextFileTabDelimiter := false
Tbl.TextFileSemicolonDelimiter := Info.delimiter = ";" ? true : false
Tbl.TextFileCommaDelimiter := Info.delimiter = "," ? true : false
Tbl.TextFileSpaceDelimiter := false
Tbl.Refresh(false)
}
I have the following in my script which opens two CSV files in Excel. I'm trying to figure out still how to copy all of the files into one Workbook on separate Worksheet tabs.
Code: Select all
#SingleInstance, Force
fPath := "File1.csv"
XLSTT := ComObjCreate("Excel.Application")
XLSTT.Workbooks.Open(fPath, 0, 0)
XLSTT.Visible := True
fPath := "File2.csv"
XLCBD := ComObjCreate("Excel.Application")
XLCBD.Workbooks.Open(fPath, 0, 0)
XLCBD.Visible := True
Your code seems to work with my data too. Thank you! I would have thought there was a simpler way, like copying worksheets from existing Workbooks, etc. If no one comes along with a more simple solution, this will definitely be what I'll use. Appreciate your help!teadrinker wrote: ↑08 Oct 2020, 19:34I'm not sure if this code is comletely correct, but for me it works.
Code: Select all
Files =
(Join`n
C:\Users\FG\Documents\2020-04-02-AccountStatement.csv
C:\Users\FG\Documents\2020-04-06-AccountStatement.csv
)
Xl := ComObjCreate("Excel.Application")
Xl.Visible := true
Xl.Application.ScreenUpdating := false
XlNewWB := Xl.Workbooks.Add
DefaultSheets := {}
for Sheet in XlNewWB.Worksheets
{
DefaultSheets.Push(Sheet)
Sheet.Name := "Something Unique " A_Index
}
Loop, Parse, Files, `n
{
Xl.Workbooks.Open(A_LoopField)
SplitPath, A_LoopField,,,, FileName
for Sheet in Xl.Workbooks(FileName).Worksheets
{
SheetCount ++
Xl.Workbooks(FileName).Worksheets(Sheet.Name).Copy(,XlNewWB.Worksheets(SheetCount))
}
Xl.Workbooks(FileName).Close
}
for key, Sheet in DefaultSheets
Sheet.Delete
Xl.Application.ScreenUpdating := true
Code: Select all
xl := ComObjActive("excel.application")
for book in xl.workbooks
{
if (a_index = 1)
nbook := Book
else
{
for sheet in book.sheets
sheet.copy(,nbook.sheets(nbook.sheets.count)) ; expression.Copy (Before, After)
book.close(0)
}
}
xl.Dialogs(xlDialogSaveAs := 5).Show( a_desktop "\")
nbook.close()
xl.quit
return
Code: Select all
#SingleInstance, Force
File := []
File[1] := A_ScriptDir "\MyFile1.csv"
File[2] := A_ScriptDir "\MyFile2.csv"
File[3] := A_ScriptDir "\MyFile3.csv"
File[4] := A_ScriptDir "\MyFile4.csv"
XL := ComObjCreate("Excel.Application")
XL.Visible := False
WB := XL.Workbooks.Add
SheetCount := 0
For Index, FilePath In File {
XL.Workbooks.Open(FilePath)
SplitPath, FilePath,,,, FileName
For Sheet In XL.Workbooks(FileName).Worksheets {
SheetCount++
XL.Workbooks(FileName).Worksheets(Sheet.Name).Copy(,WB.Worksheets(SheetCount))
}
XL.Workbooks(FileName).Close
}
WB.Sheets("Sheet1").Delete ; Delete default sheet
WB.SaveAs(A_ScriptDir "\Merged.xlsx", 51)
WB.Close(0)
XL.Quit
XL := ""