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

AspettoComportamento
Separatore; di default: Excel in italiano separa i campi col punto e virgola
NumeriVirgola decimale con il separatore ;: Excel in italiano legge 3.5 come una data (3 maggio)
CodificaBOM UTF-8 in testa (disattivabile con bom: false), perché Excel legga gli accenti
QuotaturaRFC 4180: tra virgolette le celle con separatore, virgolette o a capo; virgolette raddoppiate; righe in CRLF
CSV injectionLe celle di testo, intestazioni comprese, che iniziano con = + - @, tab o CR sono precedute da '. I numeri negativi restano numeri
Altri valorinull/undefined vuoti, date in ISO (vuote se non valide), oggetti in JSON
Nome fileSenza 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: ',' })