Skip to content

Commit 2df6234

Browse files
committed
update stable
1 parent 80a6273 commit 2df6234

8 files changed

Lines changed: 295 additions & 0 deletions

File tree

src/stable/css/tableexport.css

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*-----------------------------------/
2+
/* CAPTION POSITIONS
3+
/*----------------------------------*/
4+
5+
.top {
6+
caption-side: top;
7+
}
8+
9+
.bottom {
10+
caption-side: bottom;
11+
}
12+
13+
/*-----------------------------------/
14+
/* BUTTON CUSTOM CLASSES
15+
/*----------------------------------*/
16+
17+
.button-default, .button-default:hover, .button-default:focus, .button-default:active {
18+
text-decoration: none;
19+
}
20+
21+
.button-default {
22+
font: bold 12px sans-serif;
23+
color: #222222;
24+
appearance: button;
25+
-moz-appearance: button;
26+
-webkit-appearance: button;
27+
padding: 5px;
28+
margin: 5px;
29+
}
30+
31+
.button-default.xlsx:before, .button-default.xls:before, .button-default.csv:before, .button-default.txt:before {
32+
content: none;
33+
}
34+
35+
.xlsx, .xls, .csv, .txt {
36+
margin: 4px 0;
37+
}
38+
39+
.xlsx:before, .xls:before, .csv:before, .txt:before {
40+
margin-right: 10px;
41+
padding: 12px;
42+
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
43+
}
44+
45+
.xlsx:before {
46+
background-color: darkgreen;
47+
content: url("../img/ixlsx.png");
48+
}
49+
50+
.xls:before {
51+
background-color: green;
52+
content: url("../img/ixls.png");
53+
}
54+
55+
.csv:before {
56+
background-color: blue;
57+
content: url("../img/icsv.png");
58+
}
59+
60+
.txt:before {
61+
background-color: purple;
62+
content: url("../img/itxt.png");
63+
}

src/stable/css/tableexport.min.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/stable/img/icsv.png

223 Bytes
Loading

src/stable/img/itxt.png

214 Bytes
Loading

src/stable/img/ixls.png

227 Bytes
Loading

src/stable/img/ixlsx.png

15.2 KB
Loading

src/stable/js/tableexport.js

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
(function ($) {
2+
3+
$.fn.tableExport = function (options) {
4+
5+
var settings = $.extend({}, $.fn.tableExport.defaults, options),
6+
rowD = $.fn.tableExport.rowDel, bootstrapClass, bootstrapTheme, bootstrapSpacing;
7+
8+
if (settings.bootstrap) {
9+
bootstrapClass = $.fn.tableExport.bootstrap[0] + " ";
10+
bootstrapTheme = $.fn.tableExport.bootstrap[1] + " ";
11+
bootstrapSpacing = $.fn.tableExport.bootstrap[2] + " ";
12+
} else {
13+
bootstrapClass = $.fn.tableExport.defaultButton + " ";
14+
bootstrapTheme = bootstrapSpacing = "";
15+
}
16+
17+
18+
return this.each(function () {
19+
var $el = $(this),
20+
$rows = settings.headings ? $el.find('tr') : $el.find('tr:has(td)'),
21+
fileName = settings.fileName === "id" ? ($el.attr('id') ? $el.attr('id') : $.fn.tableExport.defaultFileName) : settings.fileName,
22+
exporters = {
23+
xlsx: function (rDel, name) {
24+
var dataURL = $rows.map(function (i, val) {
25+
var $cols = $(val).find('th, td');
26+
return $cols.map(function (i, val) {
27+
return $(val).text()
28+
});
29+
}).get(),
30+
dataObject = JSON.stringify({
31+
data: dataURL,
32+
name: name
33+
}),
34+
myContent = $.fn.tableExport.xlsx.buttonContent,
35+
myClass = $.fn.tableExport.xlsx.defaultClass;
36+
createObjButton(dataObject, myContent, myClass);
37+
},
38+
xls: function (rdel, name) {
39+
var colD = $.fn.tableExport.xls.separator,
40+
dataURL = 'data:application/vnd.ms-excel;charset=utf-8,' +
41+
encodeURIComponent($rows.map(function (i, val) {
42+
var $cols = $(val).find('th, td');
43+
return $cols.map(function (i, val) {
44+
return $(val).html()
45+
}).get().join(colD);
46+
}).get().join(rdel)),
47+
myFile = name + ".xls",
48+
myContent = $.fn.tableExport.xls.buttonContent,
49+
myClass = $.fn.tableExport.xls.defaultClass;
50+
createButton(dataURL, myFile, myContent, myClass);
51+
},
52+
csv: function (rdel, name) {
53+
rdel = '"' + rdel + '"';
54+
var colD = '"' + $.fn.tableExport.csv.separator + '"',
55+
dataURL = 'data:text/csv;charset=utf-8,' +
56+
encodeURIComponent('"' + $rows.map(function (i, val) {
57+
var $cols = $(val).find('th, td');
58+
return $cols.map(function (i, val) {
59+
return $(val).text().replace(/"/g, '""')
60+
}).get().join(colD);
61+
}).get().join(rdel) + '"'),
62+
myFile = name + ".csv",
63+
myContent = $.fn.tableExport.csv.buttonContent,
64+
myClass = $.fn.tableExport.csv.defaultClass;
65+
createButton(dataURL, myFile, myContent, myClass);
66+
},
67+
txt: function (rdel, name) {
68+
var colD = $.fn.tableExport.txt.separator,
69+
dataURL = 'data:text/plain;charset=utf-8,' +
70+
encodeURIComponent($rows.map(function (i, val) {
71+
var $cols = $(val).find('th, td');
72+
return $cols.map(function (i, val) {
73+
return $(val).text()
74+
}).get().join(colD);
75+
}).get().join(rdel)),
76+
myFile = name + ".txt",
77+
myContent = $.fn.tableExport.txt.buttonContent,
78+
myClass = $.fn.tableExport.txt.defaultClass;
79+
createButton(dataURL, myFile, myContent, myClass);
80+
}
81+
};
82+
83+
settings.formats.forEach(
84+
function (key) {
85+
exporters[key](rowD, fileName);
86+
}
87+
);
88+
89+
function checkCaption(exportButton) {
90+
var $caption = $el.find('caption:not(.head)');
91+
$caption.length ? $caption.append(exportButton) : $el.prepend('<caption class="' + bootstrapSpacing + settings.position + '">' + exportButton + '</caption>');
92+
}
93+
94+
function createButton(dataURL, myFile, myContent, myClass) {
95+
var exportButton = "<a href='" + dataURL + "' download='" + myFile + "' role='button' class='" + bootstrapClass + bootstrapTheme + myClass + "'>" + myContent + "</a>";
96+
checkCaption(exportButton);
97+
}
98+
99+
function createObjButton(dataObject, myContent, myClass) {
100+
var exportButton = "<a href='#' data-obj='" + dataObject + "' download='" + dataObject.name + "' role='button' class='" + bootstrapClass + bootstrapTheme + myClass + "'>" + myContent + "</a>";
101+
checkCaption(exportButton);
102+
addListener(myClass)
103+
}
104+
105+
function addListener(el) {
106+
var $el = "." + el;
107+
return $($el).on("click", function (e) {
108+
if ($(this).data("obj")) {
109+
e.preventDefault();
110+
var object = $(this).data("obj"),
111+
data = object.data,
112+
fileName = object.name;
113+
export2xlsx(data, fileName);
114+
}
115+
});
116+
}
117+
118+
});
119+
};
120+
121+
// Define the plugin default properties.
122+
$.fn.tableExport.defaults = {
123+
headings: true, // (Boolean), display table headings (th elements) in the first row, (default: true)
124+
formats: ["xls", "csv", "txt"], // (String[]), filetype for the export, (default: ["xls", "csv", "txt"])
125+
fileName: "id", // (id, String), filename for the downloaded file, (default: "id")
126+
bootstrap: true, // (Boolean), style buttons using bootstrap, (default: true)
127+
position: "bottom" // (top, bottom), position of the caption element relative to table, (default: "bottom")
128+
};
129+
130+
$.fn.tableExport.xlsx = {
131+
defaultClass: "xlsx",
132+
buttonContent: "Export to xlsx"
133+
};
134+
135+
$.fn.tableExport.xls = {
136+
defaultClass: "xls",
137+
buttonContent: "Export to xls",
138+
separator: "\t"
139+
};
140+
141+
$.fn.tableExport.csv = {
142+
defaultClass: "csv",
143+
buttonContent: "Export to csv",
144+
separator: ","
145+
};
146+
147+
$.fn.tableExport.txt = {
148+
defaultClass: "txt",
149+
buttonContent: "Export to txt",
150+
separator: " "
151+
};
152+
153+
$.fn.tableExport.defaultFileName = "myDownload";
154+
155+
$.fn.tableExport.defaultButton = "button-default";
156+
157+
$.fn.tableExport.bootstrap = ["btn", "btn-default", "btn-toolbar"];
158+
159+
$.fn.tableExport.rowDel = "\r\n";
160+
161+
162+
}(jQuery));
163+
164+
function dateNum(v, date1904) {
165+
if (date1904) v += 1462;
166+
var epoch = Date.parse(v);
167+
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
168+
}
169+
170+
function createSheet(data, opts) {
171+
var ws = {};
172+
var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
173+
for (var R = 0; R != data.length; ++R) {
174+
for (var C = 0; C != data[R].length; ++C) {
175+
if (range.s.r > R) range.s.r = R;
176+
if (range.s.c > C) range.s.c = C;
177+
if (range.e.r < R) range.e.r = R;
178+
if (range.e.c < C) range.e.c = C;
179+
var cell = {v: data[R][C]};
180+
if (cell.v == null) continue;
181+
var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
182+
183+
if (typeof cell.v === 'number') cell.t = 'n';
184+
else if (typeof cell.v === 'boolean') cell.t = 'b';
185+
else if (cell.v instanceof Date) {
186+
cell.t = 'n';
187+
cell.z = XLSX.SSF._table[14];
188+
cell.v = dateNum(cell.v);
189+
}
190+
else cell.t = 's';
191+
192+
ws[cell_ref] = cell;
193+
}
194+
}
195+
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
196+
return ws;
197+
}
198+
199+
function Workbook() {
200+
if (!(this instanceof Workbook)) return new Workbook();
201+
this.SheetNames = [];
202+
this.Sheets = {};
203+
}
204+
205+
function string2ArrayBuffer(s) {
206+
var buf = new ArrayBuffer(s.length);
207+
var view = new Uint8Array(buf);
208+
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
209+
return buf;
210+
}
211+
212+
function export2xlsx(data, name) {
213+
var wb = new Workbook(),
214+
ws = createSheet(data);
215+
216+
wb.SheetNames.push(name);
217+
wb.Sheets[name] = ws;
218+
219+
var wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};
220+
var wbout = XLSX.write(wb, wopts);
221+
222+
saveAs(new Blob([string2ArrayBuffer(wbout)],
223+
{type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),
224+
name + ".xlsx");
225+
}
226+
227+
228+
229+
230+

src/stable/js/tableexport.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)