Overview
Etlworks reads and writes QlikView Data (QVD) files — the binary, single-table file format used by QlikView and Qlik Sense. QVD support is native Java: no QlikView, Qlik Sense, Python, or third-party QVD tools are required at runtime.
Use a QVD Format on a source-to-destination transformation whenever the source or the destination is a .qvd file.
A few things to know about QVD before you configure a format:
- One QVD file contains one logical table. There is no multi-worksheet or multi-dataset equivalent to Excel workbooks.
- QVD is a binary format. Unlike CSV or JSON, a QVD file cannot be inspected in a text editor.
- The connector supports metadata discovery, so field names and data types are read from the file's XML table header without any additional configuration.
Create a QVD format
Go to Connections, switch to the Formats tab, click Add Format, type QVD in the search box, and pick QVD.
Reading QVD files
The QVD connector reads the file's XML header, symbol table, and row/index table in a single pass and returns each row to the transformation.
The connector understands the standard QVD symbol value types:
- integer — 32-bit signed integer values from the symbol table.
- double — floating-point numeric values.
- string — text values.
- dual integer and dual double — QVD's "dual" representation, where a value has both a raw numeric part and a display string. Dates, times, timestamps, and formatted numbers are typically stored this way.
The connector recognizes real Qlik field header elements (QvdFieldHeader) and reads column-level metadata from them.
Value Mode
Dual values — QVD's representation of a value that has both a numeric part and a display string — can be returned in three different ways. Set Value Mode on the format to control which:
- Typed (default) — the connector returns native numeric values and converts QVD date, time, and timestamp duals to DATE / TIME / TIMESTAMP where possible. This is the right choice when the destination is a database, another typed format, or any pipeline that expects real dates and numbers.
- Display — the connector returns the Qlik display string for dual values, exactly as Qlik would render it. Useful when the destination is text-oriented (CSV, plain JSON) and you want the Qlik-formatted value preserved verbatim.
- Calculation — the connector returns the raw numeric calculation value for dual values. For dates and times this is the underlying Qlik serial number (a floating-point offset from Qlik's epoch), which is what Qlik uses internally when applying formulas.
Concrete example: a QVD column whose values are dates stored as dual values. In Typed mode a row returns a DATE. In Display mode the same row returns the formatted string, for example 7/7/2026. In Calculation mode the same row returns the raw Qlik serial value, for example 46213.
Data types
In Typed Value Mode, the connector maps QVD number formats to Etlworks / JDBC types where possible:
- DATE, TIME, TIMESTAMP — from dual values whose Qlik number format identifies them as temporal.
- INTEGER — from QVD integer symbol values within the 32-bit signed range.
- DOUBLE — from QVD double symbol values and from dual double values whose format is not temporal.
- VARCHAR — from QVD string symbol values, and from any other type when a specific mapping is not available.
Force everything to text
Enable All fields are strings to skip type detection and read every field as VARCHAR. Useful when the downstream system expects strings, or when Qlik-side formatting matters more than the underlying numeric type.
Boolean and large-integer edge cases on write
QVD does not define a dedicated boolean symbol type. When Etlworks writes a boolean value, it is stored as text (true or false), so downstream QVD readers see it as a string column.
QVD integer symbols are 32-bit signed. Values outside that range are written as strings instead, so precision is not lost. Consumers that expect an integer column should be aware of this fallback.
Null values are supported in both directions.
Column names
The QVD format shares the same column-name controls as other file formats.
SQL-compatible names
Enable Column names compatible with SQL to strip characters that are not valid in SQL identifiers (anything other than alphanumerics and underscores). Useful when the destination is a database and the QVD's field names contain spaces, dashes, or other special characters.
Remove dots from column names
Enable Remove dots from column names to strip . characters from field names. Can be enabled independently of the SQL-compatible option.
Function to calculate Field Name
Set Function to calculate Field Name to a JavaScript expression that transforms each column name. The same conventions used by other file formats apply.
Writing QVD files
Etlworks writes QVD destination files natively. A few things about how the write path works:
- QVD write is not streaming. The QVD file format requires the complete symbol table before the row and index tables can be finalized, so the connector collects rows in memory during the transformation and writes the file at the end. Plan for enough heap when writing large tables to QVD.
- The connector writes uncompressed QVD table payloads internally — the QVD header's Compression field is not set to any of QVD's internal compression modes. For external ZIP/GZIP wrapping, see Archive compression below.
- The generated QVD file contains an XML table header, field metadata, the symbol table, and a bit-packed row/index table — the standard QVD structure that Qlik and third-party QVD readers understand.
The write path supports the value types you would expect: strings, integers, doubles and other numeric values, dates, times, and timestamps, booleans (stored as text — see Boolean and large-integer edge cases on write), and nulls.
Archive compression
Set Archive Format on the QVD format to wrap the file in an archive on write, and to unwrap the archive on read. Values:
- No Compression (default) — the connector writes and reads a plain .qvd file.
- zip — the connector writes and reads the QVD file inside a ZIP archive.
- gzip — the connector writes and reads the QVD file inside a GZIP stream.
Two things to be clear about here:
- This setting is Etlworks archive compression around the QVD file. It is a separate concept from QVD's own internal table compression. Enabling zip or gzip here does not change the QVD header's internal Compression field or the way the QVD's symbol/row tables are encoded.
- On the read side, Etlworks also unwraps files by extension when Archive Format is set. Files with .zip, .gz, or .gzip extensions are handled where applicable.
QVD internal compression is not supported. If a source QVD file uses one of QVD's internal compression modes, Etlworks fails explicitly with a clear error rather than silently misreading the data. This is an intentional safety guard against subtle data corruption — if you hit this, re-export the source from Qlik without internal compression, or run it through a QVD conversion step first.
File name overrides
Set Function to calculate Filename to a JavaScript expression that transforms the file name at read or write time. The same variables that other file formats expose are available:
- fileName — the file name Etlworks is about to use.
- isReading — true when reading, false when writing.
- batchNumber — the current batch index when the transformation writes multiple output files.
Limitations and behavior notes
- One table per file. A QVD file holds one logical table. If the source contains multiple related tables, produce one QVD file per table.
- Writing is not streaming. The whole dataset is held in memory until the file is written. Large writes need proportional heap.
- QVD internal compression is not supported. Etlworks reads and writes uncompressed QVD table payloads. Use Archive Format for external ZIP or GZIP wrapping.
- Complex or nested structures should be flattened before writing. QVD is a flat, single-table format; nested arrays and records need to be expanded into columns beforehand.
- Booleans and large integers on write are stored as strings — see Boolean and large-integer edge cases on write.
- If exact Qlik display formatting matters for a downstream consumer, load the generated QVD in the target Qlik environment and verify the display before shipping the pipeline.
Related articles
- Excel Formats — the closest analogue for spreadsheet-style tabular data. QVD's single-table constraint means the multi-worksheet techniques described there do not apply, but the overall format-configuration pattern is similar.
- Avro Format — row-oriented binary format with schema evolution support.
- Parquet Format — columnar binary format optimized for analytical reads.
- CSV Format — plain-text tabular format.
- JSON Format — hierarchical text format.
- Source-to-destination transformation — how format-driven transformations are configured end to end.