Fixing csv export/import, add new config option for csv export encoding (utf-8 || iso-8895-15)

This commit is contained in:
Maximilian Krambach 2019-02-07 13:17:54 +01:00 committed by Emanuel Schütze
parent 268403cc92
commit ee88dff41f
5 changed files with 39 additions and 4 deletions

View File

@ -40,6 +40,7 @@ _('Allow access for anonymous guest users');
_('Show this text on the login page');
_('Export');
_('Separator used for all csv exports and examples');
_('Default encoding for all csv exports');
_('Page number alignment in PDF');
_('Left');
_('Center');

View File

@ -288,7 +288,7 @@ export abstract class BaseImportService<V extends BaseViewModel> {
public onSelectFile(event: any): void {
// TODO type
if (event.target.files && event.target.files.length === 1) {
if (event.target.files[0].type === 'text/csv') {
if (event.target.files[0].type.startsWith('text/csv')) {
this._rawFile = event.target.files[0];
this.readFile(event.target.files[0]);
} else {

View File

@ -83,10 +83,12 @@ export class CsvExportService {
filename: string,
{
lineSeparator = '\r\n',
columnSeparator = this.config.instant('general_csv_separator')
columnSeparator = this.config.instant('general_csv_separator'),
encoding = this.config.instant('general_csv_encoding')
}: {
lineSeparator?: string;
columnSeparator?: string;
encoding?: 'utf-8' | 'iso-8859-15';
} = {}
): void {
let csvContent = []; // Holds all lines as arrays with each column-value
@ -153,8 +155,12 @@ export class CsvExportService {
return line.map(entry => tsList[0] + entry + tsList[0]).join(columnSeparator);
})
.join(lineSeparator);
this.exporter.saveFile(csvContentAsString, filename, 'text/csv');
const filetype = `text/csv;charset=${encoding}`;
if (encoding === 'iso-8859-15') {
this.exporter.saveFile(this.exporter.convertTo8859_15(csvContentAsString), filename, filetype);
} else {
this.exporter.saveFile(csvContentAsString, filename, filetype);
}
}
/**

View File

@ -35,4 +35,18 @@ export class FileExportService {
const pattern = new RegExp(/^[^\\\/\?%\*:\|\"\<\>]*[^\.]+$/i);
return pattern.test(filename);
}
/**
* get an iso-8859-15 - compatible blob part
*
* @param data
* @returns a Blob part
*/
public convertTo8859_15(data: string): BlobPart {
const array = new Uint8Array(new ArrayBuffer(data.length));
for (let i = 0; i < data.length; i++) {
array[i] = data.charCodeAt(i);
}
return array;
}
}

View File

@ -138,6 +138,20 @@ def get_config_variables():
subgroup="Export",
)
yield ConfigVariable(
name="general_csv_encoding",
default_value="utf-8",
input_type="choice",
label="Default encoding for all csv exports",
choices=(
{"value": "utf-8", "display_name": "UTF-8"},
{"value": "iso-8859-15", "display_name": "ISO-8859-15"},
),
weight=143,
group="General",
subgroup="Export",
)
yield ConfigVariable(
name="general_export_pdf_pagenumber_alignment",
default_value="center",