Merge pull request #57 from SkyKilla/master

Copy / Delete Sheet
This commit is contained in:
Andrey Kurdyumov
2017-10-08 03:36:00 +06:00
committed by GitHub
Regular → Executable
+70 -18
View File
@@ -57,33 +57,85 @@ module.exports = (function() {
return obj === undefined ? defaultValue : obj;
}
/**
/**
* Delete unused sheets if needed
*/
Workbook.prototype.deleteSheet = function(sheetName){
var self = this;
var sheet = self.loadSheet(sheetName);
Object.keys(self.archive.files).forEach(function(key){
if (key.indexOf(sheet.id) != -1)
delete self.archive.files[key];
})
var sh = self.workbook.find("sheets/sheet[@sheetId='" + sheet.id + "']");
self.workbook.find("sheets").remove(sh);
var rel = self.workbookRels.find("Relationship[@Id='" + sh.attrib['r:id'] + "']");
self.workbookRels.remove(rel);
var id = self.sheets.findIndex(function(el){return el.id == sheet.id});
self.sheets.splice(id, 1);
self.workbook.find("sheets").delItem(id);
var el = self.workbook.find("definedNames");
if (el){
el.delItem(id);
el.findall("definedName").forEach(function(item, index){
item.attrib.localSheetId = index.toString()
})
}
self.archive.file(self.workbookPath, etree.tostring(self.workbook));
self._rebuild();
return self
};
/**
* Clone sheets in current workbook template
*/
Workbook.prototype.copySheet = function(sheetName, copyName){
var self = this;
var sheet = self.loadSheet(sheetName); //filename, name , id, root
var newSheetIndex = (self.workbook.findall("sheets/sheet").length+1).toString();
var fileName = 'worksheets' + '/' + 'sheet' + newSheetIndex + '.xml';
var arcName = self.prefix + '/' + fileName;
self.archive.file(arcName, etree.tostring(sheet.root) );
self.archive.files[arcName].options.binary = true;
var newSheet = etree.SubElement( self.workbook.find('sheets'), 'sheet' );
newSheet.attrib.name = copyName || 'Sheet' + newSheetIndex;
newSheet.attrib.sheetId = newSheetIndex;
newSheet.attrib['r:id'] = 'rId' + newSheetIndex;
var newRel = etree.SubElement(self.workbookRels, 'Relationship');
newRel.attrib.Type = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';
newRel.attrib.Target = fileName;
self._rebuild();
// TODO: work with "definedNames"
// var defn = etree.SubElement(self.workbook.find('definedNames'), 'definedName');
//
return self
};
/**
* Partially rebuild after copy/delete sheets
*/
Workbook.prototype._rebuild = function(){
//each <sheet> 'r:id' attribute in '\xl\workbook.xml'
//must point to correct <Relationship> 'Id' in xl\_rels\workbook.xml.rels
var self = this;
var order = ['worksheet', 'theme', 'styles','sharedStrings'];
self.workbookRels.findall("*")
.sort(function(rel1, rel2){ //using order
var index1 = order.indexOf( path.basename(rel1.attrib.Type) );
var index2 = order.indexOf( path.basename(rel2.attrib.Type) );
if ((index1 + index2) == 0)
return rel1._id - rel2._id;
return index1 - index2
})
.forEach(function(item, index) {
item.attrib.Id = 'rId' + (index+1);
})
self.workbook.findall("sheets/sheet").forEach(function(item, index) {
item.attrib['r:id'] = 'rId' + (index+1);
item.attrib.sheetId = (index+1).toString();
})
self.archive.file(self.prefix + '/' + '_rels' + '/' + path.basename(self.workbookPath) + '.rels', etree.tostring(self.workbookRels));
self.archive.file(self.workbookPath, etree.tostring(self.workbook));
self.sheets = self.loadSheets(self.prefix, self.workbook, self.workbookRels);
}
/**
* Load a .xlsx file from a byte array.
*/