/* ExcelXMLcpp.h ----------------------- Header file C++ ------------------------------------------

  Modulo per creare file Excel formato Foglio XML (Excel 2003)

------------------------------------------------------------------------------------------------- */
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

#ifndef EXCELXMLC_H
#define EXCELXMLC_H
#define EXPORT __declspec(dllexport)

/* Struttura di definizione di un foglio */
struct xlsSheetStruct {
   char SheetName[32];          /* nome breve senza spazi  */
   char Description[128];
   char FootPage[128];
   char HeaderMargin[8];        /* in Inch, default = "0.5"  */
   char FooterMargin[8];        /* in Inch, default = "0.5"  */
   char MarginTop[8];           /* in Inch, default = "1", anche numero decimale  */
   char MarginBottom[8];        /* in Inch  */
   char MarginLeft[8];          /* in Inch  */
   char MarginRight[8];         /* in Inch  */
   char PrintGrid;              /* se = "1", in stampa visualizza la griglia (default = "1")  */
   char Protected;              /* se = "1" protegge il Foglio, altrimenti = "0" (default)  */
   unsigned char RowHeight;     /* altezza di default delle righe (0 = non gestita, 16 = normale)  */
   char Layout;                 /* puņ essere 'P' (portrait) o 'L' (landscape)  */
};

/* Struttura di definizione di uno stile di cella  */
struct xlsStyleStruct {
   char ID[16];              /* ID senza spazi che identifica lo Style  */
   /* Allineamento del testo contenuto nella cella  */
   char Align[16];           /* "Left" (default), "Right", "Center"  */
   char VAlign[16];          /* "Top", "Bottom" (default), "Center"  */
   unsigned char Indent;     /* numero di caratteri di rientro del testo  */
   /* Bordo della cella  */
   char BorderType[16];      /* (=LineStyle) di default č "Continuous", puņ essere anche:  */
                             /*  "Double", "Dot", "Dash", "DashDot"  */
   char BorderColor[8];      /* di default niente, = nero  */
   unsigned char BorderTop;           /* 0 = nessun bordo in alto, altrimenti valore da 1 a 3 (= Weight)  */
   unsigned char BorderBottom;        /* 0 = nessun bordo in basso, altrimenti da 1 a 3  */
   unsigned char BorderLeft;          /* 0 = nessun bordo a sinistra, altrimenti da 1 a 3  */
   unsigned char BorderRight;         /* 0 = nessun bordo a destra, altrimenti da 1 a 3  */
   /* Caratteristiche del Font usato nella cella  */
   char FontName[32];        /* nome del font, se nessuno, č il font di default  */
   char FontBold; 
   char FontItalic;
   unsigned char FontSize;
   char FontColor[8];        /* di default č "#000000" = nero  */
   /* Caratteristiche dello sfondo della cella (Interior)  */
   char BGcolor[8];          /*  */
   char BGpattern[32];       /* nome del pattern di colorazione, di default "Solid", puņ essere anche, tra gli altri:  */
                             /* "Gray50", "Gray25", "Gray125", "Gray0625", "ThinDiagStripe", "ThinReverseDiagStripe",  */
                             /* "ThinDiagCross", "ThinHorzCross", "ThinHorzStripe", "ThinVertStripe",  */
   char BGpatternColor[8];   /*  */
   char NumberFormat[32];    /* di default niente, puņ essere "Fixed", "Scientific", "Short Date"  */
   char WrapText;            /* di default niente, puņ essere "1" per andare a capo nella stessa cella  */
   char VerticalText;        /* di default niente, puņ essere "1" per testo scritto verticalmente  */
   int  Rotate;              /* di default nessuna rotazione, altrimenti č l'angolo in gradi, anche negativo  */
   char Protected;           /* se = "1" protegge la cella, altrimenti = "0",  */
   /* i colori vanno usati come stringhe RGB esadecimali, del tipo "#rrggbb", oppure usando  */
   /* il nome del colore inglese in minuscolo  */
};

#define Alfabeto "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    /* per la decodifica colonna-riga  */

/* Classe C++  */

class xlsExcel {

public:
   /* Strutture  */ 
   xlsSheetStruct defaultSheet;
   xlsStyleStruct defaultStyle;
   /* Variabili  */
   int nSheets;         /* numero di fogli contenuti */
   string FileName;     /* Nome file di Output */
   string listaSheet;   /* per controllo sui doppioni */
   string listaStili;   /* per controllo sui doppioni */
   string SheetsToDel;  /* per eventuale elenco Sheet da cancellare quando si fa il Merge */
   string error_msg;

   /* Metodi  */
   xlsExcel(string NomeFile, string Author="", string OldExcelFile=""); 
   
   int xlsAddStyle(xlsStyleStruct Stile, string IDstile="");
   
   int xlsAddSheet(string nomeSheet);
   int xlsAddSheet(string nomeSheet, xlsSheetStruct Sheet);
      
   int xlsColumn(int numColonna, int Larghezza, string IDstile="");
      
   int xlsWriteCell(string Valore, char Tipo='S', string IDstile="", string Formula="", 
       int nColSkip=0, int MergeAcross=0, int MergeDown=0);
      
   int xlsNewLine(int skip=0, int RowWidth=0, string IDstile="");
   
   int xlsClose(void);
   
   string xlsGetPosition(void);
   
   string xlsGetRectangle(int Riga1, int Col1, int Riga2, int Col2);
   
   int xlsSheetDelete(string nomeSheet);
      
   int xlsInitMerge(string OldFile, string NewFile);

private:

   void __ChiudiSheet(void);
   int __CopiaSheet(void);   

   /* Flag e Contatori vari: */
   struct xlsSheetStruct __Sheet;    /* per salvataggio struttura Sheet in corso */
    
   int ActualRow;      /* contatore righe */
   int ActualCol;      /* contatore colone */
   int __Sequenza;     /* 0 = inizio (si possono aggiungere stili), 1 = č iniziato uno sheet, 2 = č iniziata la scrittura celle */
   int __flagOpenRow;  /* = False */
   int flagMerge;      /* se True, si sta facendo un Merge */
   string __RowAttribute;
   ofstream fOut;          /* Handle file in Output  */
   ifstream fIn;           /* Handle file in Input per Merge  */
    
   string _xmlBuffer;

};

string AsciiToUtf8 (string strAscii);

string Replace(string strIn, string strMatch, string strNew);

string itos(int i);	// convert int to string

#endif  /* EXCELXMLC_H */
