Services
exportCsv
Utility pubblica per esportare in CSV un array già in memoria, con i default di Excel in italiano (separatore `;`, virgola decimale, BOM UTF-8), quotatura RFC 4180 e neutralizzazione delle formule.
Utility pubblica (non un composable). Serve per dati calcolati nel client — risultati aggregati, righe derivate — che non sono una risorsa registrata sul servizio di import/export e quindi non passano da
@pzeta/vue-importexport. Per una tabella c'èDataTable.exportCSV(), che usa le stesse regole.
Firma TypeScript
import { csvFileName, exportCsv, toCsv } from '@pzeta/vue-components'
import type { CsvColumn, CsvOptions } from '@pzeta/vue-components'
function exportCsv<T>(rows: readonly T[], columns: readonly CsvColumn<T>[], filename: string, options?: CsvOptions): void
function toCsv<T>(rows: readonly T[], columns: readonly CsvColumn<T>[], options?: CsvOptions): string
function csvFileName(name: string): string
interface CsvColumn<T> {
field: keyof T | ((row: T) => unknown) // campo della riga o funzione
header: string
}
interface CsvOptions {
separator?: string // default ';'
decimalSeparator?: '.' | ',' // default ',' con ';', '.' con gli altri separatori
bom?: boolean // default true (solo exportCsv)
}
Regole
| Aspetto | Comportamento |
|---|---|
| Separatore | ; di default: Excel in italiano separa i campi col punto e virgola |
| Numeri | Virgola decimale con il separatore ;: Excel in italiano legge 3.5 come una data (3 maggio) |
| Codifica | BOM UTF-8 in testa (disattivabile con bom: false), perché Excel legga gli accenti |
| Quotatura | RFC 4180: tra virgolette le celle con separatore, virgolette o a capo; virgolette raddoppiate; righe in CRLF |
| CSV injection | Le celle di testo, intestazioni comprese, che iniziano con = + - @, tab o CR sono precedute da '. I numeri negativi restano numeri |
| Altri valori | null/undefined vuoti, date in ISO (vuote se non valide), oggetti in JSON |
| Nome file | Senza diacritici, caratteri non validi sostituiti da -, estensione .csv (csvFileName) |
Esempio
import { exportCsv } from '@pzeta/vue-components'
exportCsv(
risultati,
[
{ field: 'domanda', header: 'Domanda' },
{ field: 'risposte', header: 'Risposte' },
{ field: (r) => r.risposte / r.totale, header: 'Quota' },
],
'Risultati sondaggio' // → Risultati-sondaggio.csv
)
// Solo il testo, senza download (es. per un test o un invio al server)
const testo = toCsv(risultati, colonne, { separator: ',' })