Learn R Programming

tab2xml

The goal of tab2xml is to convert spreadsheet files (.xlsx or .ods) into structured XML documents using a predefined template. The package processes the spreadsheet data, replacing template tokens with corresponding values, and manages foreign key relationships automatically.

Installation

You can install the released version of tab2xml from CRAN with:

install.packages("tab2xml")

And the development version from GitHub with:

# install.packages("pak")
pak::pak("josesamos/tab2xml")

Example

This example demonstrates how to use tab2xml to convert an Excel or ODS file into an XML file, based on a schema example from the Mondrian Documentation.

library(tab2xml)

# Define file paths
source_xml <- system.file("extdata", "schema_template.xml", package = "tab2xml")
source_xlsx <- system.file("extdata", "schema.xlsx", package = "tab2xml")
temp_file <- tempfile(fileext = ".xml")

Show spreadsheet contents

sheet_names <- readxl::excel_sheets(source_xlsx)
for (sheet in sheet_names) {
  cat("\n#### Sheet:", sheet)
  data <- readxl::read_excel(source_xlsx, sheet = sheet)
  print(knitr::kable(data))
}

Sheet: Cube

cube_pknametable_fk
1Sales1

Sheet: Table

table_pkname
1sales_fact_1997
2customer
3time_by_day

Sheet: Dimension

dimension_pknameforeignKeycube_fk
1Gendercustomer_id1
2Timetime_id1

Sheet: Hierarchy

hierarchy_pknamehasAllallMemberNameprimaryKeydimension_fktable_fk
1GendertrueallMemberName=“All Genders”customer_id12
2TimefalseNAtime_id23

Sheet: Level

namecolumntypeuniqueMembershierarchy_fk
GendergenderStringtrue1
Yearthe_yearNumerictrue2
QuarterquarterNumericfalse2
Monthmonth_of_yearNumericfalse2

Sheet: Measure

namecolumnaggregatorformatStringcube_fk
Unit Salesunit_salessum#,###1
Store Salesstore_salessum#,###.##1
Store Coststore_costsum#,###.001

Sheet: CalculatedMember

calculatedmember_pknamedimensionformulacube_fk
1ProfitMeasures[Measures].[Store Sales] - [Measures].[Store Cost]1

Sheet: CalculatedMemberProperty

namevaluecalculatedmember_fk
FORMAT_STRING$#,##0.001

Convert spreadsheet to XML

file <- sheet2xml(source_xlsx, source_xml, temp_file, optimize = TRUE)

Check output

library(xml2)
#> Warning: package 'xml2' was built under R version 4.4.3

xml_content <- readLines(file, warn = FALSE)

cat("```xml\n", paste(xml_content, collapse = "\n"), "\n```", sep = "")
<?xml version="1.0" encoding="UTF-8"?>
<Schema>
  <Cube name="Sales">
    <Table name="sales_fact_1997"/>
    <Dimension name="Gender" foreignKey="customer_id">
      <Hierarchy name="Gender" hasAll="true" allMemberName="All Genders" primaryKey="customer_id">
        <Table name="customer"/>
        <Level name="Gender" column="gender" type="String" uniqueMembers="true"/>
      </Hierarchy>
    </Dimension>
    <Dimension name="Time" foreignKey="time_id">
      <Hierarchy name="Time" hasAll="false" primaryKey="time_id">
        <Table name="time_by_day"/>
        <Level name="Year" column="the_year" type="Numeric" uniqueMembers="true"/>
        <Level name="Quarter" column="quarter" type="Numeric" uniqueMembers="false"/>
        <Level name="Month" column="month_of_year" type="Numeric" uniqueMembers="false"/>
      </Hierarchy>
    </Dimension>
    <Measure name="Unit Sales" column="unit_sales" aggregator="sum" formatString="#,###"/>
    <Measure name="Store Sales" column="store_sales" aggregator="sum" formatString="#,###.##"/>
    <Measure name="Store Cost" column="store_cost" aggregator="sum" formatString="#,###.00"/>
    <CalculatedMember name="Profit" dimension="Measures" formula="[Measures].[Store Sales] - [Measures].[Store Cost]">
      <CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>
    </CalculatedMember>
  </Cube>
</Schema>

In this way, we can organize and work with the data in tabular form and generate XML documents directly using the provided templates.

Copy Link

Version

Install

install.packages('tab2xml')

Monthly Downloads

135

Version

1.1.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Jose Samos

Last Published

April 1st, 2025

Functions in tab2xml (1.1.0)

sheet2xml

Convert a Spreadsheet to XML
check_tab

Validate and Check Spreadsheet Data
validate_pk

Validate primary key column
validate_fk

Validate foreign key column
remove_empty_nodes

Remove Empty XML Nodes Recursively
is_cell_empty

Check if a dataframe cell is empty