IT: Excel v Jave? POI!

Donedávna jsem považoval za jediný smysluplný formát dat XMLko. V současnosti zjišťuji, že se ve světě ještě nepodařilo vymítit formáty typu *.xls (Excel Worksheet) či *.csv (Comma Separated Variables) – stále jsou tu 😉

V rámci projektu na kterém teď pracuju jsem potřeboval dostat z 10 megového Excel sheetu tisíce hodnot a transformovat je do výstupních CSV souborů. Podle výstupního souboru se lišila kombinace sloupců a jejich transformace. Samozřejmě že by to šlo vyřešit a smést ze stolu rychlým sledem copy&pastů v Excelu a maximálně použitím nějakého makra.

Dostávám se k jádru věci. Rozhodl jsem se pro řešení v javě. Zasvěcení asi vědí, že se k práci s Microsoft Office soubory používá open-source knihovna Jakarta POI.

Takže moje poznatky: pro práci s Excelovskými tabulkami vás zajímá jen jedna část POI – POI-HSSF. Načíst Excelovský dokument a vybrat z něj hodnoty které potřebujete je po rychlém nahlédnutí do Quick guidu záležitost pár minut. Co mě potěšilo je, že to opravdu funguje.

Jenom jsem musel pro načtení 10 MB XLS souboru jsem musel zvětšit heap VM (-Xmx196M zabralo).

Další malou záludností je iterátor přes buňky v řádku (hssfRow.cellIterator()). Nevracel buňky tak jak byste čekali, ale v jakémsi fyzickém pořadí a na v logickém. Zatím jsem nestudoval o co jde. Stačí použít hssfRow.getCell(int).

A nakonec abyste měli představu jak vypadá API sem dávám malý příklad:


FileInputStream fis = new FileInputStream(xlsFile)
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = sheet.getRow(rowNumber);
HSSFCell codeCell = row.getCell(COLUMN_CODE);

Prostě jednoduché a funkční.

Dále jsem potřeboval jeden velký CSV soubor načíst a jiný zapsat.
S tímto formátem POI nepracuje. Takže jsem pro zápis použil normální PrintWriter a pro čtení knihovnu z ostermiller.org. K ní jedna malá poznámka – CSVParser vrací jen String[][], takže nebude zrovna moc vhodný pro veliké dokumenty.

IT: titulek okna v *.bat

Dneska bych se s vámi chtěl podělit o jednu maličkost, která mě dnes potěšila 😉 Je to vážně úplná maličkost. Týká se psaní dávkových souborů (*.bat, *.cmd) ve windowsech. Stavá se vám taky, že máte najednou otevřených šest oken s příkazovou řádkou a zuřivě mezi nimi přepínáte přes Alt+Tab a hledáte to jediné správné? Tak teď už to bude jednodušší. Dodnes jsem netušil že existuje příkaz title [string]. Je to asi tím, že jsem se tyhle příkazy učil na MS-DOSu 5.0. A to tam ještě nebyl. Nebo ano? 🙂

Pro ty z Vás, co mají potíže vyznat se v oknech i po změně titulků, existuje ještě jedno řešeni: použít color [XX], kde XX jsou hexa-číslice reprezentující barvy.

Opakování je matka moudrosti.

IT: Apache vs. Skype

V pátek jsem potreboval něco ukazovat na notebooku. Zákon schválnosti pravidelně zafunguje. Nebyl v síti. Přinesete ho na místo, pustíte a ten nejjednodušší článek systému zničehonic přestane fungovat. Nemohl jsem pustit WWW server Apache 2:


C:\Program Files\Apache Group\Apache2\bin>Apache.exe
(OS 10048)Only one usage of each socket address (protocol/network address/port)
is normally permitted. : make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

No a bohužel nemáte moc času na řešení tohoto problému. Naštěstí se to povedlo. Takže jak postupovat? První co mě napadlo bylo že si port 80 obsadil Microsoft IIS. Jenže ten neběžel. Takže jsem si pustil utilitu TCPView z kolekce www.sysinternals.com Výborný pomocník. Z něj jsem už jednoduše zjistil, že si port 80 obsadil Skype. Zajímavé. Děje se to jenom v případě, že notebook nemám v síti. Usuzuju z toho, že Skype zkouší pro vytvoření spojení použít svoje standardní porty, ale když se mu to nepovede (notebook není v síti), obsadí si port 80 a i když se nikam nepřipojí a je ve stavu offline – zůstane viset na portu 80.

IT: Oracle a jeho služby ve windows

Pokud používáte Oracle lokálně na svém PC tak jste si jistě všimli, že vám po jeho instalaci přibylo několik nových windows service. Jelikož je Oracle docela žrout paměti, vyplatí se u některých (všech) změnit způsob jejich spouštění (Startup Type) z Automatic na Manual.

Oracle Tip Manage Oracle9i services under Windows vám na pár řádcích udělá jasno k čemu která služba je a jestli se vám vyplatí jí spouštět automaticky, ručně nebo nikdy.

Na konci článku jsou dva jednoduché skripty pro startování a stopování služeb Oraclu. Ušetří vám zdlouhavé klikání v managementu Service.