author | hayzel <hayzel> | 2004-01-07 08:08:29 (UTC) |
---|---|---|
committer | hayzel <hayzel> | 2004-01-07 08:08:29 (UTC) |
commit | 08bc72c34cae85e5cc6541c9daaeba121597c961 (patch) (side-by-side diff) | |
tree | df5b263a84099ffdf8e0b86fda9a9fe61b90d30e /noncore/apps/opie-sheet/Excel.h | |
parent | 656e80e7b35c4aefd49ffe7756d895f4e7370de1 (diff) | |
download | opie-08bc72c34cae85e5cc6541c9daaeba121597c961.zip opie-08bc72c34cae85e5cc6541c9daaeba121597c961.tar.gz opie-08bc72c34cae85e5cc6541c9daaeba121597c961.tar.bz2 |
January 7, 2004
* Release by hayzel (koppermind@panafonet.gr)
This version has many valuable changes, though It may have some annoying bugs. Please if you are interested in opie-sheet try it hard, so I can fix some of them. Also If you want some other functions that must be here and are missing feel free to ask them. (no financial functions please. :) I really hate them )
-Fixed a bug with non closed parenthesis editing&recalculation infinite loop.
-Added support for functions that can parse parameters not ONLY as numbers but also as strings.
-Added many functions that cover many computational topics rendering opie-sheet a computational tool-spreadsheet at last. (total 90 functions!)
-Maintained compatibility with the opie-fileformat.
-New icons.
-Found that the DataParser was not a real RPN compiler of the expressions. In fact it was returning faulty results in calculations, in both binary or unary operations. A1-A2-A3 was parsed as A1-(A2-A3). A1 was parsed as A1.
-Added new class "Expression" a general Parser for spreadsheet-expression. Imported from an old C# project of mine.
-Now can also parse <>=!%&^|"" in expressions.
-Added experimental Excel File format import!. The opie-sheet can import any excel file in BIFF7/BIFF8 format. These formats are used in Excel XP,2000,95. The Excel Importer class is in a good coding level.. BUT it is not complete. Only strings,numbers,formulas are imported. Not formatting rules. Not all the functions are converted in the functions of opie-sheet. Infact FEW functions are converted.
-Fixed a bug with Sheet Recalculation. Added ReCalc() function. Opie-sheet was calculating wrong the values of expression in opening/importing. if a value needed was not loaded yet in the time of calculation. Solved with ReCalc() each time the active sheet is changing.
*known issues:
-if someone enters directly text as parameter to a string function the text renders as uppercase due to the calculation engine that uppercases all the parsing sentence.
-randbetween return only integer part random... if both limit numbers are integers.
-skew and kurt function give different results compared to kspread-oofice equivalents.
-unstable parser Excel Class
-string vars and string functions are not correctly handled by excel importer.
-unicode strings are converted FINE in QString unicode format, but cannot be rendered fine if a suitable unicode font is not setuped as the default string. So the string is junked in the opie-sheet and may crash the parser.
*TODOs:
-surelly a much full-stable excel importer.
-Cell Manipulation of many Data is really slow.... must change the QList data type. To a structure more efficient.
-maybe some more functions.
-maybe some kind of charts drawing?
-maybe kspread or ooffice files import/export.
Diffstat (limited to 'noncore/apps/opie-sheet/Excel.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-sheet/Excel.h | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/noncore/apps/opie-sheet/Excel.h b/noncore/apps/opie-sheet/Excel.h new file mode 100644 index 0000000..0a581cf --- a/dev/null +++ b/noncore/apps/opie-sheet/Excel.h @@ -0,0 +1,205 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <time.h> +#include <sys/types.h> +#include <strings.h> +#include <qstring.h> +#include <qarray.h> +#include <qlist.h> + +#define DATEFORMAT 0x1 +#define NUMBERFORMAT 0x2 + +#define BIFF8 0x600 +#define BIFF7 0x500 +#define WBKGLOBAL 0x5 +#define WRKSHEET 0x10 + +#define XL_ARRAY 0x221 +#define XL_BOUNDSHEET 0x85 +#define XL_BOF 0x809 +#define XL_BOOLERR 0x205 +#define XL_CONTINUE 0x3c +#define XL_DIMENSION 0x200 +#define XL_EOF 0x0a +#define XL_EXTSST 0xff +#define XL_FORMULA 0x406 +#define XL_FORMULA2 0x6 +#define XL_FORMAT 0x41e +#define XL_INDEX 0x20b +#define XL_LABEL 0x204 +#define XL_LABELSST 0xfd +#define XL_MULRK 0xbd +#define XL_NAME 0x18 +#define XL_NOTE 0x1c +#define XL_NUMBER 0x203 +#define XL_RK 0x7e +#define XL_RK2 0x27e +#define XL_ROW 0x208 +#define XL_SST 0xfc +#define XL_STRING 0x207 +#define XL_TXO 0x1b6 +#define XL_XF 0xe0 +#define XL_UNKNOWN 0xffff + +#define CELL_LABEL 0x2 +#define CELL_NUMBER 0x3 +#define CELL_DATE 0x4 +#define CELL_BOOLEAN 0x5 +#define CELL_ERROR 0x6 + + + +class ExcelFormat +{ +public: +int code; +int type; +QString format; +ExcelFormat(); +ExcelFormat(int c,int t, QString s); +}; + +struct xfrecord +{ +int code; +int type; +QString format; +}; + +class ExcelCell +{ +public: +int type; +int row,col; +int xfindex; //xf format index of cell +int valuei; +double valued; +QString valuec; + +}; + +class ExcelBREC +{ +public: + int code; + int length; + int position; + char* data; +}; + +class SSTList +{ +public: + QArray <ExcelBREC*> rec; +}; + +class ExcelSheet +{ +public: + QString name; + ExcelBREC BOFRecord; + int position; + int type; + int rows; + int cols; + + int cellsize,rowalloc,cellalloc; + QArray <ExcelCell*> Cells; + bool InitCells(void); // true if ok + ExcelCell* Get(int row, int col); + void Set(int row, int col, ExcelCell* cell); + +}; + +struct mulrk { + int row; + int first; + int last; + int numrks; + QArray<int> rknumbers; + QArray<double> rkdbls; + QArray<int> xfindices; +}; + + + + +class ExcelBook +{ +public: +FILE *File; +int Position; +//int stringcount; +QArray <QString*> SharedStrings; +//int xfcount; +QArray <ExcelFormat*> XFRecords; +//int Sheetcount; +QArray <ExcelSheet*> Sheets; +//int name count; +QArray <QString*> Names; + +QString dateformat; +int Version; +int endian; +int Integer2Byte(int b1, int b2 ); +int Integer4Byte(int b1, int b2, int b3, int b4 ); +int Integer2ByteFile(FILE *f); +float Float4Byte(int b1, int b2, int b3, int b4); +double Double4Byte(int b1, int b2, int b3, int b4); +double Double8Byte(int b1, int b2, int b3, int b4, int b5, int b6, int b7, int b8); +void DetectEndian(void); + +bool OpenFile(char *Filename); // true if ok +bool CloseFile(void); // true if ok +void SeekPosition(int pos); // go to Pos +void SeekSkip(int pos); // skips pos bytes. +int FileEOF(void); //returns -1 if EOF else 0 +int Get2Bytes(void); //gets an int from the file +char* Read(int pos, int length); +QString ReadUnicodeChar(int pos, int length); +QString* GetString(int num); //gets the num string from SharedStrings; +int SeekBOF(void); +ExcelBREC* GetBREC(void); +ExcelBREC* PeekBREC(void); +char* GetDataOfBREC(ExcelBREC* record); +void ConvertCharToArray(ExcelBREC* record, char* chars, int length); +int SheetHandleRecord(ExcelSheet* sheet, ExcelBREC* record); +int ReadSheet(ExcelSheet* sheet); //read the sheet sheet* +ExcelSheet* GetSheet(void); +void ParseSheets(void); +void GetSheets(void); + +bool ParseBook(char *file); // THIS IS THE MAIN PARSE FUNCTION of file +QString GetASCII(char* inbytes, int pos, int chars); +QString GetUnicode(char * inbytes, int pos, int chars); +void HandleBoundSheet( ExcelBREC* rec); +void HandleName(ExcelSheet* sheet, ExcelBREC* rec); +ExcelFormat* GetFormatting(int xf); +void HandleSetOfSST(ExcelBREC* rec/*, SSTList* cont*/, char* bytes); +char* MergeBytesFromSSTs(ExcelBREC* rec,SSTList* cont); +void HandleSST(ExcelBREC* rec); +void HandleLabelSST(ExcelSheet* sheet, ExcelBREC* rec); +ExcelCell* CellLabel(int row, int col, QString str); +ExcelCell* CellNumber(int row, int col, int index, double d); +QString* CellDataString(ExcelSheet* sh, int row, int col); +int CellGetPrecision(double d); +void CellSetDateFormat(char *d); +void HandleMulrk(ExcelSheet* sheet, ExcelBREC* record); +void MulrkRead(struct mulrk *mulrk, char* data); +void HandleNumber(ExcelSheet* sheet, ExcelBREC* record); +void HandleFormat(ExcelBREC* rec); +void HandleXF(ExcelBREC* rec); +void HandleRK(ExcelSheet* sheet, ExcelBREC* record); +void HandleFormula(ExcelSheet* sheet, ExcelBREC* record); +QString GetFormula(int row, int col, ExcelSheet* sheet, char* data, int sz); +QString FindCellName(int row, int col); + + + + + +}; + |