Excel e i formati aperti

di Andrea Zani, in Imho,

Questa settimana ho dovuto lavorare parecchio con Excel. Ma non nella costruzione di fogli con il programma Excel per inserire le formulette o per creare grafici, ma per la sua gestione dal di fuori con codice .Net in un ameno CRUD - è applicabile anche fuori dal mondo dei db questo acronimo? Non sono un purista delle terminologia e dunque non me ne frega nulla.

Vediamo un po' le risorse a nostra disposizione senza componenti da installare su un server per leggere e scrivere nel formato .xls di Excel. Innanzitutto partiamo dalla creazione. Abbiamo tre grosse e facili strade:

  1. Tabella html.
  2. Xml
  3. Oledb

La prima strada è la più semplice ma assolutamente non permette alcuna configurazione. In poche parole scordiamoci l'inserimento di formule e formattazioni strane. Il contenuto della tabella sarà importata così com'è, nulla di più, nulla di meno.

L'xml si può dividere in due categorie: quello contenente solo i dati di Excel e quello che rappresenta sia i dati sia la formattazione. Nel primo caso non abbiamo niente di differente dalla tabella html prima citata, mentre nel secondo caso abbiamo pressocché tutte le potenzialità di Excel a disposizione: formattazione, formule, multi-sheet e così via... L'unica limitazione che ho trovato è nell'impossibilità di bloccare con password gli elementi presenti nel documento. Questo formato è molto semplice. Per poterlo vedere è sufficiente salvare un qualsiasi documento Excel in formato Xml e aprirlo con un qualsiasi editor:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"
xmlns:html="
http://www.w3.org/TR/REC-html40"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x2="
http://schemas.microsoft.com/office/excel/2003/xml"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x="urn:schemas-microsoft-com:office:excel">
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<Colors>
<Color>
...
</Color>
</Colors>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
...
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Default"/>...
</Styles>
<ss:Worksheet ss:Name="Foglio1">
<Table ss:StyleID="ta1"><Column ss:Width="64.2614"/><Row ss:Height="12.8409"><Cell><Data ss:Type="String">Titolo</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="Number">12</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="Number">32</Data></Cell></Row><Row ss:Height="12.8409"><Cell><Data ss:Type="Number">43</Data></Cell></Row><Row ss:Height="12.8409"><Cell ss:Formula="of:=SUM([.A2:.A4])"><Data ss:Type="Number">87</Data></Cell></Row></Table><x:WorksheetOptions/>
</ss:Worksheet>
<ss:Worksheet ss:Name="Foglio2">
<Table ss:StyleID="ta1"><Column ss:Width="64.2614"/><Row ss:Height="12.8409"><Cell ss:Index="1"/></Row></Table><x:WorksheetOptions/>
</ss:Worksheet>
<ss:Worksheet ss:Name="Foglio3">
<Table ss:StyleID="ta1"><Column ss:Width="64.2614"/><Row ss:Height="12.8409"><Cell ss:Index="1"/></Row></Table><x:WorksheetOptions/>
</ss:Worksheet>
</Workbook>

L'ultima tecnica a disposizione è grazie all'uso dell'oledb. Proprio come fosse un database, possiamo creare un foglio di excel, i singoli fogli e il contenuto tabellare. E' sufficiente usare una stringa di connessione come la seguente per accedere in lettura o, se non esiste, per creare un documento Excel:

string conn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Document.xls;Extended Properties = \"Excel 8.0;HDR=YES;\"";

Per leggere si usano i soliti comando sql-like:

select * from [Sheet1$]

Così anche per l'inserimento:

inert into [Sheet1$](NomeColonna1,NomeColonna2) values(1,2)

Per creare un nuovo sheet:

create table [AZFoglio](Colonna1 int, Colonna2 text)

Il problema è la cancellazione di un sheet. Questo comando non elimina lo sheet dal documento, ma semplicemente lo svuota:

drop table [AZFoglio]

Altra nota negativa non di poco conto? La cancellazione di righe non è supportata!

Inoltre, tutti gli sheet creati all'interno di Excel avranno il simbolo del dollaro in automatico alla fine del nome (importante saperlo perché il simbolo è necessario per le query in oledb), mentre quelli creati da Oledb, non sarà necessario.

Molto comodo questo tipo di accesso, ma ci mette subito di fronte all'impossibilità di inserire alcunché al di fuori di dati tabellari. Inoltre, l'Oledb ha un modo particolare per capire il tipo di dato presente in una colonna in un documento Excel: legge le prime otto righe per ogni colonna, e da un media tutta sua, valuta il tipo che sarà contenuto. Questo cosa comporta? Semplice, un macello se prepariamo un documento Excel contenente solo il nome delle colonne e senza alcun dato perché popolata dal nostro codice. Il perché? Intuibile. Oledb vedendo solo il nome di colonna - una stringa - penserà che il tipo è di tipo text.

Altro grave problema. Se il classico operatore che non sa distinguere Excel da un tostapane, inserisce i dati come numeri e poi testo, il tipo non corrispondente a quello calcolato dalla media all'apertura del documento, sarà ignorato.

Visto che sono saltato a piè pari alla lettura, qualsiasi persona potrebbe pensare di creare il documento Excel in formato Xml e poi leggerlo con Oledb... MAGARI! No, non è possibile. Oledb è in grado di accedere ai documenti Excel salvati nel suo formato originale. Bel casino. E per leggere un documento Excel salvato in formato Xml? Semplice, si usa il classo XmlDocument o classi simili! E sempre per aggiungere righe, modificare colonne e altro, ci si deve affidare a oggetti adatti alla trattazione di documenti Xml.

In rete sono disponibili vari oggetti per la lettura/scrittura di documenti Excel. Per esempio:

Il primo è in grado di leggere in modo perfetto (bel superiore all'Oledb) qualsiasi documento salvato in formato Excel, ma non documenti creati in Xml. La seconda classe crea un documento Excel in modo molto semplice e intuitivo, ma solo in formato Xml. Uomo avvisato...

Ma dopo tutto questo personale chiacchiericcio, qual è la morale? Innanzitutto ho voluto darei posteri questa mia esperienza in modo che altri possano perdere meno tempo in test come ho fatto io, e poi... Quando si butteranno via i formati proprietari di Excel, Word e - perché no? - Pdf, e non si usano definitivamente quelli aperti come quello di Office 2007 o di OpenOffice? E pensare come sarebbe bello! La fine dell'utilizzo di oggetti esterni e carissimi per gestire questi formati, basta installazioni di oggetti COM per la loro trattazione.

Questo è uno sfogo personale!

E non centra nulla con il fatto che oggi è il Linux Day. A proposito, sui miei computer ecco i sistemi operativi che uso:

  • Windows 2003 (in attesa di essere sostituito da Windows 2008 appena avrò una nuova macchina, i miei due SO preferiti made in Microsoft).
  • Arch Linux (la mia distribuzione Linux preferita).
  • Windows Xp SP3 (affidabilissimo anche sul quel mio catenaccio di portatile).
  • Ubuntu 8.4 (riesce a farmi funzionare tutto sul portatile).
Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese