Dobrý den, vím že se to téma už několikrát řešilo, ale stejně to stále nám uspokojivě hotové. Rád bych aktualizoval ve stávajícím dokumentu a ve stávajícím listu data z nového csv. V podstatě princip je ten, že stará data se vymažou a na jejich místo se nakopírují nová (Ne tedy nějaké hledání rozdílů).
Doteď to dělám tak, že CSV otevřu, označím oblast, pak CTR+C a ve stávajícím dokumentu CRL+V. Napadlo mě, že bych to trochu automatizoval a udělal jsem makro. V něm mám jeden zásadní problém - nevím jak vybrat právě všechna data (ani míň ani víc). Metoda kopírování, kterou používám, je docela pomalá, takže příliš velká oblast třeba "A1:ZZ5000" už počítač na chvilku zastaví než se to provede. Oblast "A1:ZZ60000" způsobí kolaps. Data v CSV mají různý rozsah jak co týká sloupců tak řádků. Rád bych si vytvořil obecné řešení. Jiná možnost by byla nakopírovat celý obsah listu, ale takovou metodu jsem ani nenašel, možná neexistuje.
Sub vloz_csv
dim doc as object, tempdoc as object, list as object, csvlist as object
dim adresa as string
dim arg1(2) as new com.sun.star.beans.PropertyValue
doc = thisComponent
list = doc.getCurrentController.getActiveSheet()
adresa = convertToURL(PickFile())
with com.sun.star.sheet.CellFlags
list.ClearContents(.VALUE or .STRING or .DATETIME)
end with
arg1(0).Name = "FilterName"
arg1(0).Value = "Text – txt – csv (StarCalc)" 'název filtru
arg1(1).Name = "FilterOptions"
arg1(1).Value = "44,34,76,1" '59=středník, nic pro oddelovac textu, 76=UTF-8,1=první řádek
arg1(2).Name = "Hidden"
arg1(2).Value = True
tempDoc = starDeskTop.LoadComponentFromURL(adresa," ",0,arg1())
csvlist = tempDoc.Sheets.GetByIndex(0)
zdroj = csvlist.getCellRangeByName("A1:ZZ5000").getDataArray
tempDoc.close(True)
list.getCellRangeByName("A1:ZZ5000").setDataArray(zdroj)
msgbox ("Fajn",0,"Info")
End Sub
Editoval ludviktrnka (8. 2. 2017 20:07:39)