* Fires when source document has been loaded
* @param {Pman.Gnumerci} this
*/
- "load" : true
+ 'load' : true
});
Roo.util.Observable.call(this,cfg);
* @type {Object} rowInfo - list of row sizes
*/
rowInfo : false,
-
+ /**
+ * @type {Object} rowInfoDom - dom elements with sizes
+ */
+ rowInfoDom : false,
/**
* @type {Number} cmax - maximum number of columns
*/
this.sheet = false;
this.grid = false;
this.colInfo = false;
+ this.colInfoDom = false;
this.rowInfo = false;
+ this.rowInfoDom = false;
this.cmax = false;
this.rmax = false;
Roo.each(merge, function(c) {
var rc = _t.rangeToRC(c.textContent);
- //Roo.log(JSON.stringify(rc))
+ //Roo.log(JSON.stringify(rc));
if (typeof(_t.grid[rc[0].r][rc[0].c]) == 'undefined') {
- _t.grid[rc[0].r][rc[0].c] = Roo.applyIf({ r : rc[0].r, c : rc[0].c }, _t.defaultCell);
+ //Roo.log(["creating empty cell for ",rc[0].r, rc[0].c ]);
+ _t.createCell(rc[0].r, rc[0].c );
+ //_t.grid[rc[0].r][rc[0].c] = //Roo.applyIf({ r : rc[0].r, c : rc[0].c }, _t.defaultCell);
}
_t.grid[rc[0].r][rc[0].c].colspan = (rc[1].c - rc[0].c) + 1;
_t.grid[rc[0].r][rc[0].c].rowspan = (rc[1].r - rc[0].r) + 1;
for(var r = (rc[0].r); r < (rc[1].r+1); r++) {
- for(var c = rc[0].c; c < (rc[1].c+1); c++) {
+ for(var cc = rc[0].c; cc < (rc[1].c+1); cc++) {
//Roo.log('adding alias : ' + r+','+c);
- _t.grid[r][c] = _t.grid[rc[0].r][rc[0].c];
+ _t.grid[r][cc] = _t.grid[rc[0].r][rc[0].c];
}
}
-
});
// read colinfo..
var ci = this.sheet.getElementsByTagNameNS('*','ColInfo');
ci = this.sheet.getElementsByTagNameNS('*','RowInfo');
this.rowInfo = {};
+ this.rowInfoDom = {};
Roo.each(ci, function(c) {
var count = c.getAttribute('Count') || 1;
var s = c.getAttribute('No')*1;
for(var i =0; i < count; i++) {
+ _t.rowInfoDom[s+i] = c;
_t.rowInfo[s+i] = Math.floor(c.getAttribute('Unit')*1);
}
});
continue;
}
for (var c = s.c; c < s.c1;c++) {
- if (c > _t.cmax) continue;
+ if (c > _t.cmax) {
+ continue;
+ }
- if (typeof(_t.grid[r][c]) == 'undefined') _t.grid[r][c] = Roo.applyIf({ r: r , c : c }, _t.defaultCell);
+ if (typeof(_t.grid[r][c]) == 'undefined') {
+ _t.createCell(r,c);
+ //_t.grid[r][c] = Roo.applyIf({ r: r , c : c }, _t.defaultCell);
+ }
var g=_t.grid[r][c];
if (typeof(g.cls) =='undefined') {
g.cls = [];
g.styles = [];
}
- if (g.cls.indexOf(s.name) > -1) continue;
+ if (g.cls.indexOf(s.name) > -1) {
+ continue;
+ }
g.cls.push(s.name);
g.styles.push(s.dom);
},
Fore : function(ent,v) {
var col=[];
- Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); })
+ Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); });
ent['color'] = 'rgb(' + col.join(',') + ')';
},
Back : function(ent,v) {
var col=[];
- Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); })
+ Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); });
ent['background-color'] = 'rgb(' + col.join(',') + ')';
},
FontUnit : function(ent,v) {
ent['font-size'] = v + 'px';
},
FontBold : function(ent,v) {
- if (v*1 < 1) return;
+ if (v*1 < 1) { return; }
ent['font-weight'] = 'bold';
},
FontItalic : function(ent,v) {
- if (v*0 < 1) return;
+ if (v*0 < 1) { return; }
//ent['font-weight'] = 'bold';
},
FontName : function(ent,v) {
BorderColor : function(ent,v) {
var vv = v.split('-');
var col=[];
- Roo.each(vv[1].split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); })
+ Roo.each(vv[1].split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); });
ent['border-'+vv[0]+'-color'] = 'rgb(' + col.join(',') + ')';
}
- }
+ };
function add(e, k, v) {
//Roo.log(k,v);
e.gstyle[k] = v;
set : function(cell, v, vt, vf) {
var cs= typeof(cell) == 'string' ? this.toRC(cell) : cell;
- //Roo.log( cs.r+ ',' + cs.c + ' = '+ v);
+
+
+ Roo.log( cs.r+ ',' + cs.c + ' = '+ v);
// need to generate clell if it doe
if (typeof(this.grid[cs.r]) == 'undefined') {
Roo.log('no row:' + cell);
Roo.log('cell not defined:' + cell);
this.createCell(cs.r,cs.c);
}
+ // cell might not be rendered yet... so if we try and create a cell, it overrides the default formating..
+
if (typeof(this.grid[cs.r][cs.c].dom) == 'undefined') {
Roo.log('no default content for cell:' + cell);
- this.createCell(cs.r,cs.c);
+ Roo.log(this.grid[cs.r][cs.c]);
+ //this.createCell(cs.r,cs.c);
//return;
}
this.grid[cs.r][cs.c].value= v;
- this.grid[cs.r][cs.c].dom.textContent= v;
+ if (this.grid[cs.r][cs.c].dom) {
+ this.grid[cs.r][cs.c].dom.textContent= v;
+ }
+
+
if (typeof(vt) != 'undefined') {
this.grid[cs.r][cs.c].valueType = vt;
this.grid[cs.r][cs.c].dom.setAttribute('ValueType', vt);
data = data || this.data;
for (var r = 0; r < this.rmax;r++) {
- if (typeof(this.grid[r]) == 'undefined') continue;
+ if (typeof(this.grid[r]) == 'undefined') {
+ continue;
+ }
for (var c = 0; c < this.cmax;c++) {
if (typeof(this.grid[r][c]) == 'undefined') {
continue;
{
// read the first row.
var tds = Roo.get(table).select('tr').item(0).select('td');
- var nc = 0;
- tds.each(function(td) {
- var cs = td.dom.getAttribute('colspan');
- cs = cs ? cs * 1 : 1;
- nc += cs;
+ var maxnc = 0;
+
+ Roo.get(table).select('tr').each(function(trs) {
+ var nc = 0;
+
+ trs.select('td').each(function(td) {
+ var cs = td.dom.getAttribute('colspan');
+ cs = cs ? cs * 1 : 1;
+ nc += cs;
+ });
+ maxnc = Math.max(nc, maxnc);
});
+
var tr = document.createElement('tr');
table.appendChild(tr);
- var ar = {}
- for (i =0; i < nc; i++) {
+ var ar = {};
+ for (i =0; i < maxnc; i++) {
ar[i] = document.createElement('td');
tr.appendChild(ar[i]);
}
// find the left.
- var ret = { cols : nc, pos : {} };
- for (i =0; i < nc; i++) {
+ var ret = { cols : maxnc, pos : {} };
+ for (i =0; i < maxnc; i++) {
ret.pos[ Roo.get(ar[i]).getLeft()] =i;
}
+ ret.near = function(p) {
+ // which one is nearest..
+
+ if (this.pos[p]) {
+ return this.pos[p];
+ }
+ var prox = 100000;
+ var match = 0;
+ for(var i in this.pos) {
+ var dis = Math.abs(p-i);
+ if (dis < prox) {
+ prox = dis;
+ match = this.pos[i];
+ }
+ }
+ return match;
+
+ }
table.removeChild(tr);
return ret;
},
var table_data = this.readTableData(datagrid);
+ // oroginally this cleaned line breaks, but we acutally need them..
var cleanHTML = function (str) {
- var ret = str;
- ret = ret.replace(/ /g,'.');
- ret = ret.replace(/\n/g,'.');
- ret = ret.replace(/\r/g,'.');
+ var ret = str;
+ ret = ret.replace(/ /g,' ');
+ // ret = ret.replace(/\n/g,'.');
+ // ret = ret.replace(/\r/g,'.');
var i;
- while (-1 != (i = ret.indexOf(unescape('%A0')))) {
- ret = ret.substring(0,i) + ' ' + ret.substring(i+1,str.length);
- }
+
return ret;
};
for(var row=0;row<rows.length;row++) {
- //var style = document.defaultView.getComputedStyle(rows[row], "");
- //if (rows[row].getAttribute('xls:height')) {
- // this.setRowHeight(row+y_offset, 0 + rows[row].getAttribute('xls:height'));
- //} else {
- // this.setRowHeight(row+y_offset, 0 + style.height.replace(/[^0-9.]+/g,''));
- // }
+ // let's see what affect this has..
+ // it might mess things up..
-
- var cols = rows[row].getElementsByTagName('td');
+ if (rows[row].getAttribute('xls:height')) {
+ this.setRowHeight(row + yoff +1, 1* rows[row].getAttribute('xls:height'));
+ } else {
+ this.setRowHeight( row + yoff +1, Roo.get(rows[row]).getHeight());
+ }
+ var cols = rows[row].getElementsByTagName('td');
for(var col=0;col < cols.length; col++) {
-
-
+ if (cols[col].getAttribute('xls:width')) {
+ this.setColumnWidth(col, 1 * cols[col].getAttribute('xls:width'));
+ }
var colspan = cols[col].getAttribute('colspan');
colspan = colspan ? colspan *1 : 1;
var rowspan = cols[col].getAttribute('rowspan');
rowspan = rowspan ? rowspan * 1 : 1;
- var realcol = table_data.pos[ Roo.get(cols[col]).getLeft() ];
+ var realcol = table_data.near( Roo.get(cols[col]).getLeft() );
if (colspan > 1 || rowspan > 1) {
-
+ // getting thisese right is tricky..
this.mergeRegion(
realcol + xoff,
- row + yoff,
+ row + yoff +1,
realcol+ xoff + (colspan -1),
- row + yoff + (rowspan -1)
+ row + yoff + rowspan
);
}
- parseHtmlStyle : function(dom, row, col, cspan, rspan) {
+ parseHtmlStyle : function(dom, row, col, colspan, rowspan) {
function toCol (rgb) {
- var ar = rgb.replace(/rgb\(/, '').replace(/\)/, '').replace(/ /, '').split(',');
+
+ var ar = rgb.replace(/rgb[a]?\(/, '').replace(/\)/, '').replace(/ /, '').split(',');
var rcs = [];
+ ar = ar.slice(0,3);
Roo.each(ar, function(c) {
-
- rcs.push((c*256).toString(16)) ;
+ rcs.push((c*c).toString(16)) ;
});
return rcs.join(':');
'color': function(ent,v) {
ent['Fore'] = toCol(v);
+ // this is a bit dumb.. we assume that if it's not black text, then it's shaded..
+ if (ent['Fore'] != '0:0:0') {
+ ent['Shade'] = 1;
+ }
+
},
'background-color' : function(ent,v) {
ent['Back'] = toCol(v);
-
+
}
- }
+ };
var ent = {
HAlign:"1",
}
map[k](ent,val);
}
+ // special flags..
+ if (el.dom.getAttribute('xls:wraptext')) {
+ ent.WrapText = 1;
+ }
+ if (el.dom.getAttribute('xls:valign')) {
+ ent.VAlign= 1;
+ }
+ if (el.dom.getAttribute('xls:halign')) {
+ ent.HAlign= 1;
+ }
// fonts..
var fmap = {
'font-size' : function(ent,v) {
- ent['FontUnit'] = v.replace(/px/, '');
+ ent['Unit'] = v.replace(/px/, '');
},
'font-weight' : function(ent,v) {
- if (v != 'bold') return;
- ent['FontBold'] = 1;
+ if (v != 'bold') {
+ return;
+ }
+ ent['Bold'] = 1;
+ },
+ 'font-style' : function(ent,v) {
+ if (v != 'italic') {
+ return;
+ }
+ ent['Italic'] = 1;
}
- //FontItalic : function(ent,v) {
- // if (v*0 < 1) return;
- // //ent['font-weight'] = 'bold';
- //},
-
- }
+ };
var fent = {
Unit:"10",
fmap[k](fent,val);
}
var font = el.getStyle('font-family') || 'Sans';
-
+ if (font.split(',').length > 1) {
+ font = font.split(',')[1].replace(/\s+/, '');
+ }
/// -- now create elements..
//<gnm:StyleRegion startCol="0" startRow="0" endCol="255" endRow="65535"
var sr = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:StyleRegion');
objs.appendChild(sr);
+ objs.appendChild(this.doc.createTextNode("\n"));// add a line break..
+
sr.setAttribute('startCol', col);
sr.setAttribute('endCol', col+ colspan-1);
sr.setAttribute('startRow', row);
- sr.setAttribute('endRow', row +rowspan -1);
+ sr.setAttribute('endRow', row + rowspan -1);
var st = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:Style');
sr.appendChild(st);
// do we need some defaults..
for(var k in ent) {
- Roo.log(k);
+ //Roo.log(k);
st.setAttribute(k, ent[k]);
}
st.appendChild(fo);
// do we need some defaults..
for(var k in fent) {
- fo.setAttribute(k, ent[k]);
+ fo.setAttribute(k, fent[k]);
}
fo.textContent = font;
// start adding them all together..
if (sb) {
- st.appendChild(sb)
+ st.appendChild(sb);
}
*/
- writeImage : function (row, col, data, width, height)
+ writeImage : function (row, col, data, width, height, type)
{
+ if (!data) {
+ throw "write Image called with missing data";
+ }
// our default height width is 50/50 ?!
//console.log('w='+width+',height='+height);
// <gmr:Objects>
// step 1 - work out how many columns it will span..
// lets hope the spreadsheet is big enought..
var colwidth = 0;
- var endcol=col
+ var endcol=col;
for ( endcol=col;endcol <100; endcol++) {
if (!this.colInfo[endcol]) {
this.colInfo[endcol] = 100; // eak fudge
break;
}
}
-
soi.setAttribute('ObjectBound',
//gnumeric_colRowToName(row,col) + ':' + gnumeric_colRowToName(row+1,col+1));
soi.setAttribute('crop-left','0.000000');
soi.setAttribute('crop-right','0.000000');
// <Content image-type="jpeg" size-bytes="3900">...... < / Content>
+
+ var name = 'Image' + Math.random().toString(36).substring(2);
var content = this.doc.createElement('Content');
- content.setAttribute('image-type','jpeg');
- //alert(imgsrc);
-
- content.setAttribute('size-bytes',data.length);
- content.textContent = data;
+ content.setAttribute('image-type', type ? type : 'jpeg');
+ content.setAttribute('name', name);
soi.appendChild(content);
objs.appendChild(soi);
+
+ var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0];
+
+ var goimage = this.doc.createElement('GOImage');
+ goimage.setAttribute('image-type', type ? type : 'jpeg');
+ goimage.setAttribute('name', name);
+ goimage.setAttribute('type', 'GOPixbuf');
+ goimage.setAttribute('width', width);
+ goimage.setAttribute('height', height);
+ goimage.textContent = data;
+
+ godoc.appendChild(goimage);
+
return true;
//< /gnm:SheetObjectImage>
// < /gnm:Objects>
},
+
+ writeFixedImage : function (startCol, startRow, endCol, endRow, type, data, width, height)
+ {
+ if (!data) {
+ throw "write Image called with missing data";
+ }
+
+ startCol = startCol * 1;
+ startRow = startRow * 1;
+ endCol = endCol * 1;
+ endRow = endRow * 1;
+ width = width * 1;
+ height = height * 1;
+
+ var objs = this.sheet.getElementsByTagNameNS('*','Objects')[0];
+ var soi = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:SheetObjectImage');
+
+ soi.setAttribute('ObjectBound',this.RCtoCell(startRow, startCol) + ':' + this.RCtoCell(endRow, endCol));
+
+ soi.setAttribute('ObjectOffset', '0 0 0 0');
+ soi.setAttribute('ObjectAnchorType','16 16 16 16');
+ soi.setAttribute('Direction','17');
+ soi.setAttribute('crop-top','0.000000');
+ soi.setAttribute('crop-bottom','0.000000');
+ soi.setAttribute('crop-left','0.000000');
+ soi.setAttribute('crop-right','0.000000');
+
+ var name = 'Image' + Math.random().toString(36).substring(2);
+ var content = this.doc.createElement('Content');
+ content.setAttribute('image-type', type ? type : 'jpeg');
+ content.setAttribute('name', name);
+ soi.appendChild(content);
+ objs.appendChild(soi);
+
+ Roo.log(name);
+
+ var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0];
+
+ var goimage = this.doc.createElement('GOImage');
+ goimage.setAttribute('image-type', type ? type : 'jpeg');
+ goimage.setAttribute('name', name);
+ goimage.setAttribute('type', 'GOPixbuf');
+ goimage.setAttribute('width', width);
+ goimage.setAttribute('height', height);
+ goimage.textContent = data;
+
+ godoc.appendChild(goimage);
+
+ return true;
+ },
/**
* mergeRegion:
// return;
//}
- cell.textContent = this.RCtoCell(row1,col1) + ':' + this.RCtoCell(row2,col2)
+ cell.textContent = this.RCtoCell(row1,col1) + ':' + this.RCtoCell(row2,col2);
//var merges = this.gnumeric.getElementsByTagNameNS('*','MergedRegions');
var merges = this.sheet.getElementsByTagNameNS('*','MergedRegions');
this.sheet.insertBefore(merges,sl);
} else {
merges = merges[0];
- }
+ }
merges.appendChild(cell);
},
//<gmr:Rows DefaultSizePts="12.75">
// <gmr:RowInfo No="2" Unit="38.25" MarginA="0" MarginB="0" HardSize="1"/>
// < /gmr:Rows>
+
+ // this doesnt handle row ranges very well.. - with 'count in them..'
+
+ if (this.rowInfoDom[r]) {
+ this.rowInfoDom[r].setAttribute('Unit', height);
+ return;
+ }
+
var rows = this.sheet.getElementsByTagNameNS('*','Rows')[0]; // assume this exists..
var ri = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd','gnm:RowInfo');
// assume we have no rows..
ri.setAttribute('MarginB', 0);
ri.setAttribute('HardSize', 1);
rows.appendChild(ri);
+ this.rowInfoDom[r] = ri;
},
/**
sheetnames = this.doc.getElementsByTagNameNS('*','Sheet');
sheetnames[0].parentNode.appendChild(sheetnames[sheetnames.length-1].cloneNode(true));
var sn = this.doc.getElementsByTagNameNS('*','Sheet')[sheet];
- var cls = sn.getElementsByTagNameNS('*','Cells')[0]
+ var cls = sn.getElementsByTagNameNS('*','Cells')[0];
while (cls.childNodes.length) {
cls.removeChild(cls.firstChild);
}
column = column *1;
width= width*1;
if (typeof(this.colInfoDom[column]) == 'undefined') {
- var cols = this.doc.getElementsByTagNameNS('*','Cols')[0];
+ var cols = this.sheet.getElementsByTagNameNS('*','Cols')[0];
var ri = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:ColInfo');
ri.setAttribute('No', column);
ri.setAttribute('Unit', width);
for (var r = 0; r < this.rmax;r++) {
out += '<tr style="height:'+this.rowInfo[r]+'px;">';
for (var c = 0; c < this.cmax;c++) {
- var g = (typeof(grid[r][c]) == 'undefined') ? defaultCell : grid[r][c];
+ if (typeof(grid[r][c]) == 'undefined') {
+ this.createCell(r,c);
+
+ }
+ var g = grid[r][c];
- if (typeof(g.cls) =='undefined') g.cls = [];
+ if (typeof(g.cls) =='undefined') {
+ g.cls = [];
+ }
var w= calcWidth(c,g.colspan);
+
+ var value = g.value[0] == '=' ? 'CALCULATED' : g.value;
+
+ try {
+ if(
+ g.styles[0].firstElementChild.getAttribute('Format') == "D\\-MMM\\-YYYY;@" &&
+ g.value[0] != '=' &&
+ !isNaN(value * 1) &&
+ value != 0
+ ){
+ value = new Date(value * 24 * 60 * 60 * 1000 + new Date('1899-12-30').getTime()).format('d-M-Y');
+ }
+
+ } catch(e) {
+
+ }
+
out+=String.format('<td colspan="{0}" rowspan="{1}" class="{4}"><div style="{3}">{2}</div></td>',
- g.colspan, g.rowspan, g.value,
+ g.colspan, g.rowspan, value,
'overflow:hidden;' +
'width:'+w+'px;' +
{
name = name || "Missing_download_filename";
- if (this.downloadURL && this.downloadURL.charAt(this.downloadURL .length-1) != '/') {
+ if (this.downloadURL && this.downloadURL.charAt(this.downloadURL.length-1) != '/') {
this.downloadURL += '/';
}
var ser = new XMLSerializer();
var x = new Pman.Download({
method: 'POST',
+ timeout : 120000, // quite a long wait.. 2 minutes.
params : {
xml : ser.serializeToString(this.doc),
format : 'xls', //xml