mirror of
https://github.com/optilude/xlsx-template.git
synced 2026-07-02 08:27:39 +08:00
Regular → Executable
+70
-18
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user