mirror of
https://github.com/tfussell/xlnt.git
synced 2024-03-22 13:11:17 +08:00
20d3a1dc98
generate man page from docs
1860 lines
61 KiB
Groff
1860 lines
61 KiB
Groff
.\"t
|
|
.\" Automatically generated by Pandoc 1.19.2.2
|
|
.\"
|
|
.TH "" "" "" "" ""
|
|
.hy
|
|
.SH [IMAGE: xlnt
|
|
logo (https://user-images.githubusercontent.com/1735211/29433390-f37fa28e-836c-11e7-8a60-f8df4c30b424.png)]
|
|
.PD 0
|
|
.P
|
|
.PD
|
|
.PP
|
|
[IMAGE: Travis Build
|
|
Status (https://travis-ci.org/tfussell/xlnt.svg?branch=master)] (https://travis-ci.org/tfussell/xlnt)
|
|
[IMAGE: AppVeyor Build
|
|
status (https://ci.appveyor.com/api/projects/status/2hs79a1xoxy16sol?svg=true)] (https://ci.appveyor.com/project/tfussell/xlnt)
|
|
[IMAGE: Coverage
|
|
Status (https://coveralls.io/repos/github/tfussell/xlnt/badge.svg?branch=master)] (https://coveralls.io/github/tfussell/xlnt?branch=master)
|
|
[IMAGE: ReadTheDocs Documentation
|
|
Status (https://readthedocs.org/projects/xlnt/badge/?version=latest)] (http://xlnt.readthedocs.org/en/latest/?badge=latest)
|
|
[IMAGE: License (http://img.shields.io/badge/license-MIT-blue.svg?style=flat)] (http://opensource.org/licenses/MIT)
|
|
.SS Introduction
|
|
.PP
|
|
xlnt is a modern C++ library for manipulating spreadsheets in memory and
|
|
reading/writing them from/to XLSX files as described in ECMA 376 4th
|
|
edition (http://www.ecma-international.org/publications/standards/Ecma-376.htm).
|
|
The first public release of xlnt version 1.0 was on May 10th, 2017.
|
|
Current work is focused on increasing compatibility, improving
|
|
performance, and brainstorming future development goals.
|
|
For a high\-level summary of what you can do with this library, see the
|
|
feature
|
|
list (https://tfussell.gitbooks.io/xlnt/content/docs/introduction/Features.html).
|
|
Contributions are welcome in the form of pull requests or discussions on
|
|
the repository\[aq]s Issues
|
|
page (https://github.com/tfussell/xlnt/issues).
|
|
.SS Example
|
|
.PP
|
|
Including xlnt in your project, creating a new spreadsheet, and saving
|
|
it as "example.xlsx"
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <xlnt/xlnt.hpp>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ xlnt::workbook\ wb;
|
|
\ \ \ \ xlnt::worksheet\ ws\ =\ wb.active_sheet();
|
|
\ \ \ \ ws.cell("A1").value(5);
|
|
\ \ \ \ ws.cell("B2").value("string\ data");
|
|
\ \ \ \ ws.cell("C3").formula("=RAND()");
|
|
\ \ \ \ ws.merge_cells("C3:C4");
|
|
\ \ \ \ ws.freeze_panes("B2");
|
|
\ \ \ \ wb.save("example.xlsx");
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
//\ compile\ with\ \-std=c++14\ \-Ixlnt/include\ \-lxlnt
|
|
\f[]
|
|
.fi
|
|
.SS Documentation
|
|
.PP
|
|
Documentation for the current release of xlnt is available
|
|
here (https://tfussell.gitbooks.io/xlnt/content/).
|
|
.SS License
|
|
.PP
|
|
xlnt is released to the public for free under the terms of the MIT
|
|
License.
|
|
See LICENSE.md (https://github.com/tfussell/xlnt/blob/master/LICENSE.md)
|
|
for the full text of the license and the licenses of xlnt\[aq]s
|
|
third\-party dependencies.
|
|
LICENSE.md (https://github.com/tfussell/xlnt/blob/master/LICENSE.md)
|
|
should be distributed alongside any assemblies that use xlnt in source
|
|
or compiled form.
|
|
.SS Introduction
|
|
.IP \[bu] 2
|
|
Motivation (Motivation.md)
|
|
.IP \[bu] 2
|
|
Examples (Examples.md)
|
|
.IP \[bu] 2
|
|
Features (Features.md)
|
|
.IP \[bu] 2
|
|
Installation (Installation.md)
|
|
.SS Motivation
|
|
.SS Examples
|
|
.SS Simple \- reading from an existing xlsx spread sheet.
|
|
.PP
|
|
The following C plus plus code will read the values from an xlsx file
|
|
and print the string values to the screen.
|
|
This is a very simple example to get you started.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <iostream>
|
|
#include\ <xlnt/xlnt.hpp>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ xlnt::workbook\ wb;
|
|
\ \ \ \ wb.load("/home/timothymccallum/test.xlsx");
|
|
\ \ \ \ auto\ ws\ =\ wb.active_sheet();
|
|
\ \ \ \ std::clog\ <<\ "Processing\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ for\ (auto\ row\ :\ ws.rows(false))\
|
|
\ \ \ \ {\
|
|
\ \ \ \ \ \ \ \ for\ (auto\ cell\ :\ row)\
|
|
\ \ \ \ {\
|
|
\ \ \ \ \ \ \ \ std::clog\ <<\ cell.to_string()\ <<\ std::endl;
|
|
\ \ \ \ }
|
|
\ \ \ \ }
|
|
\ \ \ \ std::clog\ <<\ "Processing\ complete"\ <<\ std::endl;
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Save the contents of the above file
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
/home/timothymccallum/process.cpp
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Compile by typing the following command
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
g++\ \-std=c++14\ \-lxlnt\ process.cpp\ \-o\ process
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Excecute by typing the following command
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
\&./process
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The output of the program, in my case, is as follows
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
Processing\ spread\ sheet
|
|
This\ is\ cell\ A1.
|
|
This\ is\ cell\ B1
|
|
\&...\ and\ this\ is\ cell\ C1
|
|
We\ are\ now\ on\ the\ second\ row\ at\ cell\ A2
|
|
B2
|
|
C2
|
|
Processing\ complete
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
As you can see the process.cpp file simply walks through the spread
|
|
sheet values row by row and column by column (A1, B1, C1, A2, B2, C2 and
|
|
so on).
|
|
.SS Simple \- storing a spread sheet in a 2 dimensional C++ Vector for
|
|
further processing
|
|
.PP
|
|
Loading a spread sheet into a Vector provides oppourtunities for you to
|
|
perform high performance processing.
|
|
There will be more examples on performing fast look\-ups, merging data,
|
|
performing deduplication and more.
|
|
For now, let\[aq]s just learn how to get the spread sheet loaded into
|
|
memory.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <iostream>
|
|
#include\ <xlnt/xlnt.hpp>
|
|
#include\ <vector>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ xlnt::workbook\ wb;
|
|
\ \ \ \ wb.load("/home/timothymccallum/test.xlsx");
|
|
\ \ \ \ auto\ ws\ =\ wb.active_sheet();
|
|
\ \ \ \ std::clog\ <<\ "Processing\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ std::clog\ <<\ "Creating\ a\ single\ vector\ which\ stores\ the\ whole\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ std::vector<\ std::vector<std::string>\ >\ theWholeSpreadSheet;
|
|
\ \ \ \ for\ (auto\ row\ :\ ws.rows(false))\
|
|
\ \ \ \ {\
|
|
\ \ \ \ \ \ \ \ std::clog\ <<\ "Creating\ a\ fresh\ vector\ for\ just\ this\ row\ in\ the\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ std::vector<std::string>\ aSingleRow;
|
|
\ \ \ \ for\ (auto\ cell\ :\ row)\
|
|
\ \ \ \ {\
|
|
\ \ \ \ \ \ \ \ std::clog\ <<\ "Adding\ this\ cell\ to\ the\ row"\ <<\ std::endl;
|
|
\ \ \ \ \ \ \ \ aSingleRow.push_back(cell.to_string());
|
|
\ \ \ \ }
|
|
\ \ \ \ std::clog\ <<\ "Adding\ this\ entire\ row\ to\ the\ vector\ which\ stores\ the\ whole\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ theWholeSpreadSheet.push_back(aSingleRow);
|
|
\ \ \ \ }
|
|
\ \ \ \ std::clog\ <<\ "Processing\ complete"\ <<\ std::endl;
|
|
\ \ \ \ std::clog\ <<\ "Reading\ the\ vector\ and\ printing\ output\ to\ the\ screen"\ <<\ std::endl;
|
|
\ \ \ \ for\ (int\ rowInt\ =\ 0;\ rowInt\ <\ theWholeSpreadSheet.size();\ rowInt++)
|
|
\ \ \ \ {
|
|
\ \ \ \ \ \ \ \ for\ (int\ colInt\ =\ 0;\ colInt\ <\ theWholeSpreadSheet.at(rowInt).size();\ colInt++)
|
|
\ \ \ \ {
|
|
\ \ \ \ \ \ \ \ std::cout\ <<\ theWholeSpreadSheet.at(rowInt).at(colInt)\ <<\ std::endl;
|
|
\ \ \ \ \ \ \ \ }
|
|
\ \ \ \ }
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Save the contents of the above file
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
/home/timothymccallum/process.cpp
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Compile by typing the following command
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
g++\ \-std=c++14\ \-lxlnt\ process.cpp\ \-o\ process
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
Excecute by typing the following command
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
\&./process
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The output of the program, in my case, is as follows
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
Processing\ spread\ sheet
|
|
Creating\ a\ single\ vector\ which\ stores\ the\ whole\ spread\ sheet
|
|
Creating\ a\ fresh\ vector\ for\ just\ this\ row\ in\ the\ spread\ sheet
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ entire\ row\ to\ the\ vector\ which\ stores\ the\ whole\ spread\ sheet
|
|
Creating\ a\ fresh\ vector\ for\ just\ this\ row\ in\ the\ spread\ sheet
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ cell\ to\ the\ row
|
|
Adding\ this\ entire\ row\ to\ the\ vector\ which\ stores\ the\ whole\ spread\ sheet
|
|
Processing\ complete
|
|
Reading\ the\ vector\ and\ printing\ output\ to\ the\ screen
|
|
This\ is\ cell\ A1.
|
|
This\ is\ cell\ B1
|
|
\&...\ and\ this\ is\ cell\ C1
|
|
We\ are\ now\ on\ the\ second\ row\ at\ cell\ A2
|
|
B2
|
|
C2
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
You will have noticed that this process is very fast.
|
|
If you type the "time" as shown below, you can measure just how fast
|
|
loading and retrieving your spread sheet is, using xlnt; In this case
|
|
only a fraction of a second.
|
|
More on this later.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
time\ ./process\
|
|
\&...
|
|
real\ \ \ \ 0m0.044s
|
|
\f[]
|
|
.fi
|
|
.SS Simple \- writing values to a new xlsx spread sheet.
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <iostream>
|
|
#include\ <xlnt/xlnt.hpp>
|
|
#include\ <vector>
|
|
#include\ <string>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ //Creating\ a\ 2\ dimensional\ vector\ which\ we\ will\ write\ values\ to
|
|
\ \ \ \ std::vector<\ std::vector<std::string>\ >\ wholeWorksheet;
|
|
\ \ \ \ //Looping\ through\ each\ row\ (100\ rows\ as\ per\ the\ second\ argument\ in\ the\ for\ loop)
|
|
\ \ \ \ for\ (int\ outer\ =\ 0;\ outer\ <\ 100;\ outer++)
|
|
\ \ \ \ {
|
|
\ \ \ \ \ \ \ \ //Creating\ a\ fresh\ vector\ for\ a\ fresh\ row
|
|
\ \ \ \ std::vector<std::string>\ singleRow;
|
|
\ \ \ \ //Looping\ through\ each\ of\ the\ columns\ (100\ as\ per\ the\ second\ argument\ in\ the\ for\ loop)\ in\ this\ particular\ row
|
|
\ \ \ \ for(int\ inner\ =\ 0;\ inner\ <\ 100;\ inner++)
|
|
\ \ \ \ {
|
|
\ \ \ \ \ \ \ \ //Adding\ a\ single\ value\ in\ each\ cell\ of\ the\ row\
|
|
\ \ \ \ \ \ \ \ std::string\ val\ =\ std::to_string(inner\ +\ 1);
|
|
\ \ \ \ \ \ \ \ singleRow.push_back(val);\ \ \ \ \ \ \ \ \ \ \ \
|
|
\ \ \ \ }
|
|
\ \ \ \ //Adding\ the\ single\ row\ to\ the\ 2\ dimensional\ vector
|
|
\ \ \ \ wholeWorksheet.push_back(singleRow);
|
|
\ \ \ \ std::clog\ <<\ "Writing\ to\ row\ "\ <<\ outer\ <<\ "\ in\ the\ vector\ "\ <<\ std::endl;
|
|
\ \ \ \ }
|
|
\ \ \ \ //Writing\ to\ the\ spread\ sheet
|
|
\ \ \ \ //Creating\ the\ output\ workbook\
|
|
\ \ \ \ std::clog\ <<\ "Creating\ workbook"\ <<\ std::endl;
|
|
\ \ \ \ xlnt::workbook\ wbOut;
|
|
\ \ \ \ //Setting\ the\ destination\ output\ file\ name
|
|
\ \ \ \ std::string\ dest_filename\ =\ "output.xlsx";
|
|
\ \ \ \ //Creating\ the\ output\ worksheet
|
|
\ \ \ \ xlnt::worksheet\ wsOut\ =\ wbOut.active_sheet();
|
|
\ \ \ \ //Giving\ the\ output\ worksheet\ a\ title/name
|
|
\ \ \ \ wsOut.title("data");
|
|
\ \ \ \ //We\ will\ now\ be\ looping\ through\ the\ 2\ dimensional\ vector\ which\ we\ created\ above
|
|
\ \ \ \ //In\ this\ case\ we\ have\ two\ iterators\ one\ for\ the\ outer\ loop\ (row)\ and\ one\ for\ the\ inner\ loop\ (column)
|
|
\ \ \ \ std::clog\ <<\ "Looping\ through\ vector\ and\ writing\ to\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ for\ (int\ fOut\ =\ 0;\ fOut\ <\ wholeWorksheet.size();\ fOut++)
|
|
\ \ \ \ {
|
|
\ \ \ \ \ \ \ \ std::clog\ <<\ "Row"\ <<\ fOut\ <<\ std::endl;
|
|
\ \ \ \ \ \ \ \ for\ (int\ fIn\ =\ 0;\ fIn\ <\ wholeWorksheet.at(fOut).size();\ fIn++)
|
|
\ \ \ \ \ \ \ \ {
|
|
\ \ \ \ \ \ \ \ \ \ \ \ //Take\ notice\ of\ the\ difference\ between\ accessing\ the\ vector\ and\ accessing\ the\ work\ sheet
|
|
\ \ \ \ \ \ \ \ //As\ you\ may\ already\ know\ Excel\ spread\ sheets\ start\ at\ row\ 1\ and\ column\ 1\ (not\ row\ 0\ and\ column\ 0\ like\ you\ would\ expect\ from\ a\ C++\ vector)\
|
|
\ \ \ \ \ \ \ \ //In\ short\ the\ xlnt\ cell\ reference\ starts\ at\ column\ 1\ row\ 1\ (hence\ the\ +\ 1s\ below)\ and\ the\ vector\ reference\ starts\ at\ row\ 0\ and\ column\ 0
|
|
\ \ \ \ \ \ \ \ wsOut.cell(xlnt::cell_reference(fIn\ +\ 1,\ fOut\ +\ 1)).value(wholeWorksheet.at(fOut).at(fIn));
|
|
\ \ \ \ \ \ \ \ //Further\ clarification\ to\ avoid\ confusion
|
|
\ \ \ \ \ \ \ \ //Cell\ reference\ arguments\ are\ (column\ number,\ row\ number);\ e.g.\ cell_reference(fIn\ +\ 1,\ fOut\ +\ 1)
|
|
\ \ \ \ \ \ \ \ //Vector\ arguments\ are\ (row\ number,\ column\ number);\ e.g.\ wholeWorksheet.at(fOut).at(fIn)
|
|
\ \ \ \ }
|
|
\ \ \ \ }
|
|
\ \ \ \ std::clog\ <<\ "Finished\ writing\ spread\ sheet"\ <<\ std::endl;
|
|
\ \ \ \ wbOut.save(dest_filename);\
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
This process is also quite quick; a time command showed that xlnt was
|
|
able to create and write 10, 000 values to the output spread sheet in
|
|
0.582 seconds.
|
|
.SS Features
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l l l.
|
|
T{
|
|
Feature
|
|
T}@T{
|
|
Read
|
|
T}@T{
|
|
Edit
|
|
T}@T{
|
|
Write
|
|
T}
|
|
_
|
|
T{
|
|
Excel\-style Workbook
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
LibreOffice\-style Workbook
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Numbers\-style Workbook
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Encrypted Workbook (Excel 2007\-2010)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Encrypted Workbook (Excel 2013\-2016)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Excel Binary Workbook (.xlsb)
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Excel Macro\-Enabled Workbook (.xlsm)
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Excel Macro\-Enabled Template (.xltm)
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Document Properties
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Numeric Cell Values
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Inline String Cell Values
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Shared String Cell Values
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Shared String Text Run Formatting (e.g.
|
|
varied fonts within a cell)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Hyperlink Cell Values
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Formula Cell Values
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Formula Evaluation
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Page Margins
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Page Setup
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Print Area
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Comments
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Header and Footer
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Custom Views
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Charts
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Chartsheets
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Dialogsheets
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Themes
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Cell Styles
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Cell Formats
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Alignment (e.g.
|
|
right align)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Border (e.g.
|
|
red cell outline)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Fill (e.g.
|
|
green cell background)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Font (e.g.
|
|
blue cell text)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Number Format (e.g.
|
|
show 2 decimals)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Formatting\->Protection (e.g.
|
|
hide formulas)
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Column Styles
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Row Styles
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Sheet Styles
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Conditional Formatting
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Tables
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Table Formatting
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Pivot Tables
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
XLSX Thumbnail
|
|
T}@T{
|
|
✓
|
|
T}@T{
|
|
T}@T{
|
|
✓
|
|
T}
|
|
T{
|
|
Custom OOXML Properties
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Custom OOXML Parts
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Drawing
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Text Box
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
WordArt
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Embedded Content (e.g.
|
|
images)
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
T{
|
|
Excel VBA
|
|
T}@T{
|
|
T}@T{
|
|
T}@T{
|
|
T}
|
|
.TE
|
|
.SH Getting xlnt
|
|
.SS Binaries
|
|
.SS Homebrew
|
|
.SS Arch
|
|
.SS vcpkg
|
|
.SS Compiling xlnt 1.x.x from Source on Ubuntu 16.04 LTS (Xenial Xerus)
|
|
.PP
|
|
Time required: Approximately 5 minutes (depending on your internet
|
|
speed)
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
sudo\ apt\-get\ update
|
|
sudo\ apt\-get\ upgrade
|
|
sudo\ apt\-get\ install\ cmake
|
|
sudo\ apt\-get\ install\ zlibc
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The following steps update the compiler and set the appropriate
|
|
environment variables \- see note [1] below for the reason why we need
|
|
to update the standard available compiler
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
sudo\ add\-apt\-repository\ ppa:ubuntu\-toolchain\-r/test
|
|
sudo\ apt\ update
|
|
sudo\ apt\-get\ upgrade
|
|
sudo\ apt\-get\ install\ gcc\-6\ g++\-6
|
|
export\ CC=/usr/bin/gcc\-6\ \
|
|
export\ CXX=/usr/bin/g++\-6
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The following steps will intall xlnt Download the zip file from the xlnt
|
|
repository <https://github.com/tfussell/xlnt/archive/master.zip>
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
cd\ ~
|
|
unzip\ Downloads/xlnt\-master.zip
|
|
cd\ xlnt\-master
|
|
cmake\ .
|
|
make\ \-j\ 2
|
|
sudo\ make\ install
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The following step will map the shared library names to the location of
|
|
the corresponding shared library files
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
sudo\ ldconfig
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
xlnt will now be ready to use on your Ubuntu instance.
|
|
.PP
|
|
[1] Xlnt requires a minimum of gcc 6.2.0 The most recent gcc version
|
|
available using the standard APT repositories is gcc 5.4.0 (obtained
|
|
through build\-essential 12.1ubuntu2).
|
|
If these older versions of gcc are used an error "workbook.cpp error
|
|
1502:31 \[aq]extended_property\[aq] is not a class, namespace or
|
|
enumeration" will occur during the xlnt make command.
|
|
.SS Compiling from Source
|
|
.PP
|
|
Build configurations for Visual Studio, GNU Make, Ninja, and Xcode can
|
|
be created using cmake (https://cmake.org/) v3.2+.
|
|
A full list of cmake generators can be found
|
|
here (https://cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html).
|
|
A basic build would look like (starting in the root xlnt directory):
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
mkdir\ build
|
|
cd\ build
|
|
cmake\ ..
|
|
make\ \-j8
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
The resulting shared (e.g.
|
|
libxlnt.dylib) library would be found in the build/lib directory.
|
|
Other cmake configuration options for xlnt can be found using "cmake
|
|
\-LH".
|
|
These options include building a static library instead of shared and
|
|
whether to build sample executables or not.
|
|
An example of building a static library with an Xcode project:
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
mkdir\ build
|
|
cd\ build
|
|
cmake\ \-D\ STATIC=ON\ \-G\ Xcode\ ..
|
|
cmake\ \-\-build\ .
|
|
cd\ bin\ &&\ ./xlnt.test
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
\f[I]Note for Windows: cmake defaults to building a 32\-bit library
|
|
project. To build a 64\-bit library, use the Win64 generator\f[]
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
cmake\ \-G\ "Visual\ Studio\ 14\ 2015\ Win64"\ ..
|
|
\f[]
|
|
.fi
|
|
.SS Basics
|
|
.IP \[bu] 2
|
|
Workbook (/docs/basics/Workbook.md)
|
|
.IP \[bu] 2
|
|
Worksheet (/docs/basics/Worksheet.md)
|
|
.IP \[bu] 2
|
|
Cell (/docs/basics/Cell.md)
|
|
.IP \[bu] 2
|
|
Iteration (/docs/basics/Iteration.md)
|
|
.SS Workbook
|
|
.SS Worksheet
|
|
.SS Cell
|
|
.SS Iteration
|
|
.SS Advanced
|
|
.IP \[bu] 2
|
|
Formatting (Formatting.md)
|
|
.IP \[bu] 2
|
|
Properties (Properties.md)
|
|
.IP \[bu] 2
|
|
Printing (Printing.md)
|
|
.IP \[bu] 2
|
|
Encryption (Encryption.md)
|
|
.IP \[bu] 2
|
|
Views (Views.md)
|
|
.SH Formatting
|
|
.SS Format vs. Style
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <iostream>
|
|
#include\ <xlnt/xlnt.hpp>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ xlnt::workbook\ wb;
|
|
\ \ \ \ auto\ cell\ =\ wb.active_sheet().cell("A1");
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
In the context of xlnt, format and style have specific distinct
|
|
meanings.
|
|
A style in xlnt corresponds to a named style created in the "Cell
|
|
styles" dropdown in Excel.
|
|
It must have a name and optionally any of: alignment, border, fill,
|
|
font, number format, protection.
|
|
A format in xlnt corresponds to the alignment, border, fill, font,
|
|
number format, and protection settings applied to a cell via
|
|
right\-click\->"Format Cells".
|
|
A cell can have both a format and a style.
|
|
The style properties will generally override the format properties.
|
|
.SS Number Formatting
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
#include\ <iostream>
|
|
#include\ <xlnt/xlnt.hpp>
|
|
|
|
int\ main()
|
|
{
|
|
\ \ \ \ xlnt::workbook\ wb;
|
|
\ \ \ \ auto\ cell\ =\ wb.active_sheet().cell("A1");
|
|
\ \ \ \ cell.number_format(xlnt::number_format::percentage());
|
|
\ \ \ \ cell.value(0.513);
|
|
\ \ \ \ std::cout\ <<\ cell.to_string()\ <<\ std::endl;
|
|
\ \ \ \ return\ 0;
|
|
}
|
|
\f[]
|
|
.fi
|
|
.PP
|
|
An xlnt::number_format is the format code used when displaying a value
|
|
in a cell.
|
|
For example, a number_format of "0.00" implies that the number 13.726
|
|
should be displayed as "13.73".
|
|
Many number formats are built\-in to Excel and can be access with
|
|
xlnt::number_format static constructors.
|
|
Other custom number formats can be created by passing a string to the
|
|
xlnt::number_format constructor (#cell-const-cell-amp).
|
|
.SH Properties
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
xlnt::workbook\ wb;
|
|
|
|
wb.core_property(xlnt::core_property::category,\ "hors\ categorie");
|
|
wb.core_property(xlnt::core_property::content_status,\ "good");
|
|
wb.core_property(xlnt::core_property::created,\ xlnt::datetime(2017,\ 1,\ 15));
|
|
wb.core_property(xlnt::core_property::creator,\ "me");
|
|
wb.core_property(xlnt::core_property::description,\ "description");
|
|
wb.core_property(xlnt::core_property::identifier,\ "id");
|
|
wb.core_property(xlnt::core_property::keywords,\ {\ "wow",\ "such"\ });
|
|
wb.core_property(xlnt::core_property::language,\ "Esperanto");
|
|
wb.core_property(xlnt::core_property::last_modified_by,\ "someone");
|
|
wb.core_property(xlnt::core_property::last_printed,\ xlnt::datetime(2017,\ 1,\ 15));
|
|
wb.core_property(xlnt::core_property::modified,\ xlnt::datetime(2017,\ 1,\ 15));
|
|
wb.core_property(xlnt::core_property::revision,\ "3");
|
|
wb.core_property(xlnt::core_property::subject,\ "subject");
|
|
wb.core_property(xlnt::core_property::title,\ "title");
|
|
wb.core_property(xlnt::core_property::version,\ "1.0");
|
|
|
|
wb.extended_property(xlnt::extended_property::application,\ "xlnt");
|
|
wb.extended_property(xlnt::extended_property::app_version,\ "0.9.3");
|
|
wb.extended_property(xlnt::extended_property::characters,\ 123);
|
|
wb.extended_property(xlnt::extended_property::characters_with_spaces,\ 124);
|
|
wb.extended_property(xlnt::extended_property::company,\ "Incorporated\ Inc.");
|
|
wb.extended_property(xlnt::extended_property::dig_sig,\ "?");
|
|
wb.extended_property(xlnt::extended_property::doc_security,\ 0);
|
|
wb.extended_property(xlnt::extended_property::heading_pairs,\ true);
|
|
wb.extended_property(xlnt::extended_property::hidden_slides,\ false);
|
|
wb.extended_property(xlnt::extended_property::h_links,\ 0);
|
|
wb.extended_property(xlnt::extended_property::hyperlink_base,\ 0);
|
|
wb.extended_property(xlnt::extended_property::hyperlinks_changed,\ true);
|
|
wb.extended_property(xlnt::extended_property::lines,\ 42);
|
|
wb.extended_property(xlnt::extended_property::links_up_to_date,\ false);
|
|
wb.extended_property(xlnt::extended_property::manager,\ "johnny");
|
|
wb.extended_property(xlnt::extended_property::m_m_clips,\ "?");
|
|
wb.extended_property(xlnt::extended_property::notes,\ "note");
|
|
wb.extended_property(xlnt::extended_property::pages,\ 19);
|
|
wb.extended_property(xlnt::extended_property::paragraphs,\ 18);
|
|
wb.extended_property(xlnt::extended_property::presentation_format,\ "format");
|
|
wb.extended_property(xlnt::extended_property::scale_crop,\ true);
|
|
wb.extended_property(xlnt::extended_property::shared_doc,\ false);
|
|
wb.extended_property(xlnt::extended_property::slides,\ 17);
|
|
wb.extended_property(xlnt::extended_property::template_,\ "template!");
|
|
wb.extended_property(xlnt::extended_property::titles_of_parts,\ {\ "title"\ });
|
|
wb.extended_property(xlnt::extended_property::total_time,\ 16);
|
|
wb.extended_property(xlnt::extended_property::words,\ 101);
|
|
|
|
wb.custom_property("test",\ {\ 1,\ 2,\ 3\ });
|
|
wb.custom_property("Editor",\ "John\ Smith");
|
|
|
|
wb.save("lots_of_properties.xlsx");
|
|
\f[]
|
|
.fi
|
|
.SS Printing
|
|
.SS Encryption
|
|
.SS Views
|
|
.SS API
|
|
.IP \[bu] 2
|
|
cell (cell.md)
|
|
.IP \[bu] 2
|
|
cell_reference (cell_reference.md)
|
|
.SH cell
|
|
.SS \f[C]using\ xlnt::cell::type\ =\ \ cell_typeundefined\f[]
|
|
.PP
|
|
Alias xlnt::cell_type to xlnt::cell::type since it looks nicer.
|
|
.SS \f[C]friend\ class\ detail::xlsx_consumerundefined\f[]
|
|
.SS \f[C]friend\ class\ detail::xlsx_producerundefined\f[]
|
|
.SS \f[C]friend\ struct\ detail::cell_implundefined\f[]
|
|
.SS \f[C]static\ const\ std::unordered_map<std::string,\ int>&\ xlnt::cell::error_codes()\f[]
|
|
.PP
|
|
Returns a map of error strings such as #DIV/0! and their associated
|
|
indices.
|
|
.SS \f[C]xlnt::cell::cell(const\ cell\ &)=default\f[]
|
|
.PP
|
|
Default copy constructor.
|
|
.SS \f[C]bool\ xlnt::cell::has_value()\ const\f[]
|
|
.PP
|
|
Returns true if value has been set and has not been cleared using
|
|
cell::clear_value().
|
|
.SS \f[C]T\ xlnt::cell::value()\ const\f[]
|
|
.PP
|
|
Returns the value of this cell as an instance of type T.
|
|
Overloads exist for most C++ fundamental types like bool, int, etc.
|
|
as well as for std::string and xlnt datetime types: date, time,
|
|
datetime, and timedelta.
|
|
.SS \f[C]void\ xlnt::cell::clear_value()\f[]
|
|
.PP
|
|
Makes this cell have a value of type null.
|
|
All other cell attributes are retained.
|
|
.SS \f[C]void\ xlnt::cell::value(std::nullptr_t)\f[]
|
|
.PP
|
|
Sets the type of this cell to null.
|
|
.SS \f[C]void\ xlnt::cell::value(bool\ boolean_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given boolean value.
|
|
.SS \f[C]void\ xlnt::cell::value(int\ int_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(unsigned\ int\ int_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(long\ long\ int\ int_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(unsigned\ long\ long\ int\ int_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(float\ float_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(double\ float_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(long\ double\ float_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ date\ &date_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ time\ &time_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ datetime\ &datetime_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ timedelta\ &timedelta_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ std::string\ &string_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ char\ *string_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ rich_text\ &text_value)\f[]
|
|
.PP
|
|
Sets the value of this cell to the given value.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ cell\ other_cell)\f[]
|
|
.PP
|
|
Sets the value and formatting of this cell to that of other_cell.
|
|
.SS \f[C]void\ xlnt::cell::value(const\ std::string\ &string_value,\ bool\ infer_type)\f[]
|
|
.PP
|
|
Analyzes string_value to determine its type, convert it to that type,
|
|
and set the value of this cell to that converted value.
|
|
.SS \f[C]type\ xlnt::cell::data_type()\ const\f[]
|
|
.PP
|
|
Returns the type of this cell.
|
|
.SS \f[C]void\ xlnt::cell::data_type(type\ t)\f[]
|
|
.PP
|
|
Sets the type of this cell.
|
|
This should usually be done indirectly by setting the value of the cell
|
|
to a value of that type.
|
|
.SS \f[C]bool\ xlnt::cell::garbage_collectible()\ const\f[]
|
|
.PP
|
|
There\[aq]s no reason to keep a cell which has no value and is not a
|
|
placeholder.
|
|
Returns true if this cell has no value, style, isn\[aq]t merged, etc.
|
|
.SS \f[C]bool\ xlnt::cell::is_date()\ const\f[]
|
|
.PP
|
|
Returns true iff this cell\[aq]s number format matches a date format.
|
|
.SS \f[C]cell_reference\ xlnt::cell::reference()\ const\f[]
|
|
.PP
|
|
Returns a cell_reference that points to the location of this cell.
|
|
.SS \f[C]column_t\ xlnt::cell::column()\ const\f[]
|
|
.PP
|
|
Returns the column of this cell.
|
|
.SS \f[C]row_t\ xlnt::cell::row()\ const\f[]
|
|
.PP
|
|
Returns the row of this cell.
|
|
.SS \f[C]std::pair<int,\ int>\ xlnt::cell::anchor()\ const\f[]
|
|
.PP
|
|
Returns the location of this cell as an ordered pair (left, top).
|
|
.SS \f[C]std::string\ xlnt::cell::hyperlink()\ const\f[]
|
|
.PP
|
|
Returns the URL of this cell\[aq]s hyperlink.
|
|
.SS \f[C]void\ xlnt::cell::hyperlink(const\ std::string\ &url)\f[]
|
|
.PP
|
|
Adds a hyperlink to this cell pointing to the URL of the given value.
|
|
.SS \f[C]void\ xlnt::cell::hyperlink(const\ std::string\ &url,\ const\ std::string\ &display)\f[]
|
|
.PP
|
|
Adds a hyperlink to this cell pointing to the URI of the given value and
|
|
sets the text value of the cell to the given parameter.
|
|
.SS \f[C]void\ xlnt::cell::hyperlink(xlnt::cell\ target)\f[]
|
|
.PP
|
|
Adds an internal hyperlink to this cell pointing to the given cell.
|
|
.SS \f[C]bool\ xlnt::cell::has_hyperlink()\ const\f[]
|
|
.PP
|
|
Returns true if this cell has a hyperlink set.
|
|
.SS \f[C]class\ alignment\ xlnt::cell::computed_alignment()\ const\f[]
|
|
.PP
|
|
Returns the alignment that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]class\ border\ xlnt::cell::computed_border()\ const\f[]
|
|
.PP
|
|
Returns the border that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]class\ fill\ xlnt::cell::computed_fill()\ const\f[]
|
|
.PP
|
|
Returns the fill that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]class\ font\ xlnt::cell::computed_font()\ const\f[]
|
|
.PP
|
|
Returns the font that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]class\ number_format\ xlnt::cell::computed_number_format()\ const\f[]
|
|
.PP
|
|
Returns the number format that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]class\ protection\ xlnt::cell::computed_protection()\ const\f[]
|
|
.PP
|
|
Returns the protection that should be used when displaying this cell
|
|
graphically based on the workbook default, the cell\-level format, and
|
|
the named style applied to the cell in that order.
|
|
.SS \f[C]bool\ xlnt::cell::has_format()\ const\f[]
|
|
.PP
|
|
Returns true if this cell has had a format applied to it.
|
|
.SS \f[C]const\ class\ format\ xlnt::cell::format()\ const\f[]
|
|
.PP
|
|
Returns the format applied to this cell.
|
|
If this cell has no format, an invalid_attribute exception will be
|
|
thrown.
|
|
.SS \f[C]void\ xlnt::cell::format(const\ class\ format\ new_format)\f[]
|
|
.PP
|
|
Applies the cell\-level formatting of new_format to this cell.
|
|
.SS \f[C]void\ xlnt::cell::clear_format()\f[]
|
|
.PP
|
|
Removes the cell\-level formatting from this cell.
|
|
This doesn\[aq]t affect the style that may also be applied to the cell.
|
|
Throws an invalid_attribute exception if no format is applied.
|
|
.SS \f[C]class\ number_format\ xlnt::cell::number_format()\ const\f[]
|
|
.PP
|
|
Returns the number format of this cell.
|
|
.SS \f[C]void\ xlnt::cell::number_format(const\ class\ number_format\ &format)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its number_format to the
|
|
given format, and applies the format to this cell.
|
|
.SS \f[C]class\ font\ xlnt::cell::font()\ const\f[]
|
|
.PP
|
|
Returns the font applied to the text in this cell.
|
|
.SS \f[C]void\ xlnt::cell::font(const\ class\ font\ &font_)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its font to the given font,
|
|
and applies the format to this cell.
|
|
.SS \f[C]class\ fill\ xlnt::cell::fill()\ const\f[]
|
|
.PP
|
|
Returns the fill applied to this cell.
|
|
.SS \f[C]void\ xlnt::cell::fill(const\ class\ fill\ &fill_)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its fill to the given fill,
|
|
and applies the format to this cell.
|
|
.SS \f[C]class\ border\ xlnt::cell::border()\ const\f[]
|
|
.PP
|
|
Returns the border of this cell.
|
|
.SS \f[C]void\ xlnt::cell::border(const\ class\ border\ &border_)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its border to the given
|
|
border, and applies the format to this cell.
|
|
.SS \f[C]class\ alignment\ xlnt::cell::alignment()\ const\f[]
|
|
.PP
|
|
Returns the alignment of the text in this cell.
|
|
.SS \f[C]void\ xlnt::cell::alignment(const\ class\ alignment\ &alignment_)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its alignment to the given
|
|
alignment, and applies the format to this cell.
|
|
.SS \f[C]class\ protection\ xlnt::cell::protection()\ const\f[]
|
|
.PP
|
|
Returns the protection of this cell.
|
|
.SS \f[C]void\ xlnt::cell::protection(const\ class\ protection\ &protection_)\f[]
|
|
.PP
|
|
Creates a new format in the workbook, sets its protection to the given
|
|
protection, and applies the format to this cell.
|
|
.SS \f[C]bool\ xlnt::cell::has_style()\ const\f[]
|
|
.PP
|
|
Returns true if this cell has had a style applied to it.
|
|
.SS \f[C]class\ style\ xlnt::cell::style()\f[]
|
|
.PP
|
|
Returns a wrapper pointing to the named style applied to this cell.
|
|
.SS \f[C]const\ class\ style\ xlnt::cell::style()\ const\f[]
|
|
.PP
|
|
Returns a wrapper pointing to the named style applied to this cell.
|
|
.SS \f[C]void\ xlnt::cell::style(const\ class\ style\ &new_style)\f[]
|
|
.PP
|
|
Sets the named style applied to this cell to a style named style_name.
|
|
Equivalent to style(new_style.name()).
|
|
.SS \f[C]void\ xlnt::cell::style(const\ std::string\ &style_name)\f[]
|
|
.PP
|
|
Sets the named style applied to this cell to a style named style_name.
|
|
If this style has not been previously created in the workbook, a
|
|
key_not_found exception will be thrown.
|
|
.SS \f[C]void\ xlnt::cell::clear_style()\f[]
|
|
.PP
|
|
Removes the named style from this cell.
|
|
An invalid_attribute exception will be thrown if this cell has no style.
|
|
This will not affect the cell format of the cell.
|
|
.SS \f[C]std::string\ xlnt::cell::formula()\ const\f[]
|
|
.PP
|
|
Returns the string representation of the formula applied to this cell.
|
|
.SS \f[C]void\ xlnt::cell::formula(const\ std::string\ &formula)\f[]
|
|
.PP
|
|
Sets the formula of this cell to the given value.
|
|
This formula string should begin with \[aq]=\[aq].
|
|
.SS \f[C]void\ xlnt::cell::clear_formula()\f[]
|
|
.PP
|
|
Removes the formula from this cell.
|
|
After this is called, has_formula() will return false.
|
|
.SS \f[C]bool\ xlnt::cell::has_formula()\ const\f[]
|
|
.PP
|
|
Returns true if this cell has had a formula applied to it.
|
|
.SS \f[C]std::string\ xlnt::cell::to_string()\ const\f[]
|
|
.PP
|
|
Returns a string representing the value of this cell.
|
|
If the data type is not a string, it will be converted according to the
|
|
number format.
|
|
.SS \f[C]bool\ xlnt::cell::is_merged()\ const\f[]
|
|
.PP
|
|
Returns true iff this cell has been merged with one or more surrounding
|
|
cells.
|
|
.SS \f[C]void\ xlnt::cell::merged(bool\ merged)\f[]
|
|
.PP
|
|
Makes this a merged cell iff merged is true.
|
|
Generally, this shouldn\[aq]t be called directly.
|
|
Instead, use worksheet::merge_cells on its parent worksheet.
|
|
.SS \f[C]std::string\ xlnt::cell::error()\ const\f[]
|
|
.PP
|
|
Returns the error string that is stored in this cell.
|
|
.SS \f[C]void\ xlnt::cell::error(const\ std::string\ &error)\f[]
|
|
.PP
|
|
Directly assigns the value of this cell to be the given error.
|
|
.SS \f[C]cell\ xlnt::cell::offset(int\ column,\ int\ row)\f[]
|
|
.PP
|
|
Returns a cell from this cell\[aq]s parent workbook at a relative offset
|
|
given by the parameters.
|
|
.SS \f[C]class\ worksheet\ xlnt::cell::worksheet()\f[]
|
|
.PP
|
|
Returns the worksheet that owns this cell.
|
|
.SS \f[C]const\ class\ worksheet\ xlnt::cell::worksheet()\ const\f[]
|
|
.PP
|
|
Returns the worksheet that owns this cell.
|
|
.SS \f[C]class\ workbook&\ xlnt::cell::workbook()\f[]
|
|
.PP
|
|
Returns the workbook of the worksheet that owns this cell.
|
|
.SS \f[C]const\ class\ workbook&\ xlnt::cell::workbook()\ const\f[]
|
|
.PP
|
|
Returns the workbook of the worksheet that owns this cell.
|
|
.SS \f[C]calendar\ xlnt::cell::base_date()\ const\f[]
|
|
.PP
|
|
Returns the base date of the parent workbook.
|
|
.SS \f[C]std::string\ xlnt::cell::check_string(const\ std::string\ &to_check)\f[]
|
|
.PP
|
|
Returns to_check after verifying and fixing encoding, size, and illegal
|
|
characters.
|
|
.SS \f[C]bool\ xlnt::cell::has_comment()\f[]
|
|
.PP
|
|
Returns true if this cell has a comment applied.
|
|
.SS \f[C]void\ xlnt::cell::clear_comment()\f[]
|
|
.PP
|
|
Deletes the comment applied to this cell if it exists.
|
|
.SS \f[C]class\ comment\ xlnt::cell::comment()\f[]
|
|
.PP
|
|
Gets the comment applied to this cell.
|
|
.SS \f[C]void\ xlnt::cell::comment(const\ std::string\ &text,\ const\ std::string\ &author="Microsoft\ Office\ User")\f[]
|
|
.PP
|
|
Creates a new comment with the given text and optional author and
|
|
applies it to the cell.
|
|
.SS \f[C]void\ xlnt::cell::comment(const\ std::string\ &comment_text,\ const\ class\ font\ &comment_font,\ const\ std::string\ &author="Microsoft\ Office\ User")\f[]
|
|
.PP
|
|
Creates a new comment with the given text, formatting, and optional
|
|
author and applies it to the cell.
|
|
.SS \f[C]void\ xlnt::cell::comment(const\ class\ comment\ &new_comment)\f[]
|
|
.PP
|
|
Apply the comment provided as the only argument to the cell.
|
|
.SS \f[C]double\ xlnt::cell::width()\ const\f[]
|
|
.PP
|
|
Returns the width of this cell in pixels.
|
|
.SS \f[C]double\ xlnt::cell::height()\ const\f[]
|
|
.PP
|
|
Returns the height of this cell in pixels.
|
|
.SS \f[C]cell&\ xlnt::cell::operator=(const\ cell\ &rhs)\f[]
|
|
.PP
|
|
Makes this cell interally point to rhs.
|
|
The cell data originally pointed to by this cell will be unchanged.
|
|
.SS \f[C]bool\ xlnt::cell::operator==(const\ cell\ &comparand)\ const\f[]
|
|
.PP
|
|
Returns true if this cell the same cell as comparand (compared by
|
|
reference).
|
|
.SS \f[C]bool\ xlnt::cell::operator==(std::nullptr_t)\ const\f[]
|
|
.PP
|
|
Returns true if this cell is uninitialized.
|
|
.SH cell_reference
|
|
.SS \f[C]static\ std::pair<std::string,\ row_t>\ xlnt::cell_reference::split_reference(const\ std::string\ &reference_string)\f[]
|
|
.PP
|
|
Splits a coordinate string like "A1" into an equivalent pair like {"A",
|
|
1}.
|
|
.SS \f[C]static\ std::pair<std::string,\ row_t>\ xlnt::cell_reference::split_reference(const\ std::string\ &reference_string,\ bool\ &absolute_column,\ bool\ &absolute_row)\f[]
|
|
.PP
|
|
Splits a coordinate string like "A1" into an equivalent pair like {"A",
|
|
1}.
|
|
Reference parameters absolute_column and absolute_row will be set to
|
|
true if column part or row part are prefixed by a dollar\-sign
|
|
indicating they are absolute, otherwise false.
|
|
.SS \f[C]xlnt::cell_reference::cell_reference()\f[]
|
|
.PP
|
|
Default constructor makes a reference to the top\-left\-most cell, "A1".
|
|
.SS \f[C]xlnt::cell_reference::cell_reference(const\ char\ *reference_string)\f[]
|
|
.PP
|
|
Constructs a cell_reference from a string reprenting a cell coordinate
|
|
(e.g.
|
|
$B14).
|
|
.SS \f[C]xlnt::cell_reference::cell_reference(const\ std::string\ &reference_string)\f[]
|
|
.PP
|
|
Constructs a cell_reference from a string reprenting a cell coordinate
|
|
(e.g.
|
|
$B14).
|
|
.SS \f[C]xlnt::cell_reference::cell_reference(column_t\ column,\ row_t\ row)\f[]
|
|
.PP
|
|
Constructs a cell_reference from a 1\-indexed column index and row
|
|
index.
|
|
.SS \f[C]cell_reference&\ xlnt::cell_reference::make_absolute(bool\ absolute_column=true,\ bool\ absolute_row=true)\f[]
|
|
.PP
|
|
Converts a coordinate to an absolute coordinate string (e.g.
|
|
B12 \-> $B$12) Defaulting to true, absolute_column and absolute_row can
|
|
optionally control whether the resulting cell_reference has an absolute
|
|
column (e.g.
|
|
B12 \-> $B12) and absolute row (e.g.
|
|
B12 \-> B$12) respectively.
|
|
.SS \f[C]bool\ xlnt::cell_reference::column_absolute()\ const\f[]
|
|
.PP
|
|
Returns true if the reference refers to an absolute column, otherwise
|
|
false.
|
|
.SS \f[C]void\ xlnt::cell_reference::column_absolute(bool\ absolute_column)\f[]
|
|
.PP
|
|
Makes this reference have an absolute column if absolute_column is true,
|
|
otherwise not absolute.
|
|
.SS \f[C]bool\ xlnt::cell_reference::row_absolute()\ const\f[]
|
|
.PP
|
|
Returns true if the reference refers to an absolute row, otherwise
|
|
false.
|
|
.SS \f[C]void\ xlnt::cell_reference::row_absolute(bool\ absolute_row)\f[]
|
|
.PP
|
|
Makes this reference have an absolute row if absolute_row is true,
|
|
otherwise not absolute.
|
|
.SS \f[C]column_t\ xlnt::cell_reference::column()\ const\f[]
|
|
.PP
|
|
Returns a string that identifies the column of this reference (e.g.
|
|
second column from left is "B")
|
|
.SS \f[C]void\ xlnt::cell_reference::column(const\ std::string\ &column_string)\f[]
|
|
.PP
|
|
Sets the column of this reference from a string that identifies a
|
|
particular column.
|
|
.SS \f[C]column_t::index_t\ xlnt::cell_reference::column_index()\ const\f[]
|
|
.PP
|
|
Returns a 1\-indexed numeric index of the column of this reference.
|
|
.SS \f[C]void\ xlnt::cell_reference::column_index(column_t\ column)\f[]
|
|
.PP
|
|
Sets the column of this reference from a 1\-indexed number that
|
|
identifies a particular column.
|
|
.SS \f[C]row_t\ xlnt::cell_reference::row()\ const\f[]
|
|
.PP
|
|
Returns a 1\-indexed numeric index of the row of this reference.
|
|
.SS \f[C]void\ xlnt::cell_reference::row(row_t\ row)\f[]
|
|
.PP
|
|
Sets the row of this reference from a 1\-indexed number that identifies
|
|
a particular row.
|
|
.SS \f[C]cell_reference\ xlnt::cell_reference::make_offset(int\ column_offset,\ int\ row_offset)\ const\f[]
|
|
.PP
|
|
Returns a cell_reference offset from this cell_reference by the number
|
|
of columns and rows specified by the parameters.
|
|
A negative value for column_offset or row_offset results in a reference
|
|
above or left of this cell_reference, respectively.
|
|
.SS \f[C]std::string\ xlnt::cell_reference::to_string()\ const\f[]
|
|
.PP
|
|
Returns a string like "A1" for cell_reference(1, 1).
|
|
.SS \f[C]range_reference\ xlnt::cell_reference::to_range()\ const\f[]
|
|
.PP
|
|
Returns a 1x1 range_reference containing only this cell_reference.
|
|
.SS \f[C]range_reference\ xlnt::cell_reference::operator,(const\ cell_reference\ &other)\ const\f[]
|
|
.PP
|
|
I\[aq]ve always wanted to overload the comma operator.
|
|
cell_reference("A", 1), cell_reference("B", 1) will return
|
|
range_reference(cell_reference("A", 1), cell_reference("B", 1))
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator==(const\ cell_reference\ &comparand)\ const\f[]
|
|
.PP
|
|
Returns true if this reference is identical to comparand including in
|
|
absoluteness of column and row.
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator==(const\ std::string\ &reference_string)\ const\f[]
|
|
.PP
|
|
Constructs a cell_reference from reference_string and return the result
|
|
of their comparison.
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator==(const\ char\ *reference_string)\ const\f[]
|
|
.PP
|
|
Constructs a cell_reference from reference_string and return the result
|
|
of their comparison.
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator!=(const\ cell_reference\ &comparand)\ const\f[]
|
|
.PP
|
|
Returns true if this reference is not identical to comparand including
|
|
in absoluteness of column and row.
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator!=(const\ std::string\ &reference_string)\ const\f[]
|
|
.PP
|
|
Constructs a cell_reference from reference_string and return the result
|
|
of their comparison.
|
|
.SS \f[C]bool\ xlnt::cell_reference::operator!=(const\ char\ *reference_string)\ const\f[]
|
|
.PP
|
|
Constructs a cell_reference from reference_string and return the result
|
|
of their comparison.
|
|
.SH Change Log
|
|
.PP
|
|
This project adheres to Semantic Versioning (http://semver.org/).
|
|
Every release is documented on the Github
|
|
Releases (https://github.com/tfussell/xlnt/releases) page.
|
|
.SH Contributing to xlnt
|
|
.PP
|
|
xlnt welcomes contributions from everyone regardless of skill level
|
|
(provided you can write C++ or documentation).
|
|
.SS Getting Started
|
|
.PP
|
|
Look through the list of issues to find something interesting to work
|
|
on.
|
|
Help is appreciated with any issues, but important timely issues are
|
|
labeled as "help wanted".
|
|
Issues labeled "docs" might be good for those who want to contribute
|
|
without having to know too much C++.
|
|
You might also find something that the code is missing without an
|
|
associated issue.
|
|
That\[aq]s fine to work on to, but it might be best to make an issue
|
|
first in case someone else is working on it.
|
|
.SS Contributions
|
|
.PP
|
|
Contributions to xlnt should be made in the form of pull requests on
|
|
GitHub.
|
|
Each pull request will be reviewed and either merged into the current
|
|
development branch or given feedback for changes that would be required
|
|
to do so.
|
|
.PP
|
|
All code in this repository is under the MIT License.
|
|
You should agree to these terms before submitting any code to xlnt.
|
|
.SS Pull Request Checklist
|
|
.IP \[bu] 2
|
|
Branch from the head of the current development branch.
|
|
Until version 1.0 is released, this the master branch.
|
|
.IP \[bu] 2
|
|
Commits should be as small as possible, while ensuring that each commit
|
|
is correct independently (i.e.
|
|
each commit should compile and pass all tests).
|
|
Commits that don\[aq]t follow the coding style indicated in
|
|
\&.clang\-format (e.g.
|
|
indentation) are less likely to be accepted until they are fixed.
|
|
.IP \[bu] 2
|
|
If your pull request is not getting reviewed or you need a specific
|
|
person to review it, you can \@\-reply a reviewer asking for a review in
|
|
the pull request or a comment.
|
|
.IP \[bu] 2
|
|
Add tests relevant to the fixed defect or new feature.
|
|
It\[aq]s best to do this before making any changes, make sure that the
|
|
tests fail, then make changes ensuring that it ultimately passes the
|
|
tests (i.e.
|
|
TDD).
|
|
xlnt uses cxxtest for testing.
|
|
Tests are contained in a tests directory inside each module (e.g.
|
|
source/workbook/tests/test\f[I]workbook.hpp) in the form of a header
|
|
file. Each test is a separate function with a name that starts like
|
|
"test\f[]".
|
|
See <http://cxxtest.com/guide.html> for information about CxxTest or
|
|
take a look at existing tests.
|
|
.SS Conduct
|
|
.PP
|
|
Just try to be nice\-\-we\[aq]re all volunteers here.
|
|
.SS Communication
|
|
.PP
|
|
Add a comment to an existing issue on GitHub, open a new issue for
|
|
defects or feature requests, or contact \@tfussell if you want.
|
|
.SH License
|
|
.SS xlnt (https://github.com/tfussell/xlnt)
|
|
.RS
|
|
.PP
|
|
MIT License (https://github.com/tfussell/xlnt/blob/master/LICENSE.md)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
Copyright\ (c)\ 2014\-2017\ Thomas\ Fussell
|
|
|
|
Permission\ is\ hereby\ granted,\ free\ of\ charge,\ to\ any\ person\ obtaining\ a
|
|
copy\ of\ this\ software\ and\ associated\ documentation\ files\ (the
|
|
"Software"),\ to\ deal\ in\ the\ Software\ without\ restriction,\ including
|
|
without\ limitation\ the\ rights\ to\ use,\ copy,\ modify,\ merge,\ publish,
|
|
distribute,\ sublicense,\ and/or\ sell\ copies\ of\ the\ Software,\ and\ to
|
|
permit\ persons\ to\ whom\ the\ Software\ is\ furnished\ to\ do\ so,\ subject\ to
|
|
the\ following\ conditions:
|
|
|
|
The\ above\ copyright\ notice\ and\ this\ permission\ notice\ shall\ be\ included
|
|
in\ all\ copies\ or\ substantial\ portions\ of\ the\ Software.
|
|
|
|
THE\ SOFTWARE\ IS\ PROVIDED\ "AS\ IS",\ WITHOUT\ WARRANTY\ OF\ ANY\ KIND,\ EXPRESS
|
|
OR\ IMPLIED,\ INCLUDING\ BUT\ NOT\ LIMITED\ TO\ THE\ WARRANTIES\ OF
|
|
MERCHANTABILITY,\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\ AND\ NONINFRINGEMENT.
|
|
IN\ NO\ EVENT\ SHALL\ THE\ AUTHORS\ OR\ COPYRIGHT\ HOLDERS\ BE\ LIABLE\ FOR\ ANY
|
|
CLAIM,\ DAMAGES\ OR\ OTHER\ LIABILITY,\ WHETHER\ IN\ AN\ ACTION\ OF\ CONTRACT,
|
|
TORT\ OR\ OTHERWISE,\ ARISING\ FROM,\ OUT\ OF\ OR\ IN\ CONNECTION\ WITH\ THE
|
|
SOFTWARE\ OR\ THE\ USE\ OR\ OTHER\ DEALINGS\ IN\ THE\ SOFTWARE.
|
|
\f[]
|
|
.fi
|
|
.SS POLE (http://www.dimin.net/software/pole/)
|
|
.RS
|
|
.PP
|
|
BSD 2\-Clause
|
|
License (https://bitbucket.org/dimin/pole/src/c15e513bdce4c3a52b3dbc925d4d2bb520dc71d8/pole/LICENSE)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
POLE\ \-\ Portable\ C++\ library\ to\ access\ OLE\ Storage
|
|
Copyright\ (C)\ 2002\-2007\ Ariya\ Hidayat\ (ariya\@kde.org).\ All\ rights\ reserved.
|
|
|
|
Redistribution\ and\ use\ in\ source\ and\ binary\ forms,\ with\ or\ without
|
|
modification,\ are\ permitted\ provided\ that\ the\ following\ conditions
|
|
are\ met:
|
|
|
|
1.\ Redistributions\ of\ source\ code\ must\ retain\ the\ above\ copyright
|
|
\ \ \ notice,\ this\ list\ of\ conditions\ and\ the\ following\ disclaimer.
|
|
2.\ Redistributions\ in\ binary\ form\ must\ reproduce\ the\ above\ copyright
|
|
\ \ \ notice,\ this\ list\ of\ conditions\ and\ the\ following\ disclaimer\ in\ the
|
|
\ \ \ documentation\ and/or\ other\ materials\ provided\ with\ the\ distribution.
|
|
|
|
THIS\ SOFTWARE\ IS\ PROVIDED\ BY\ THE\ AUTHOR\ "AS\ IS"\ AND\ ANY\ EXPRESS\ OR
|
|
IMPLIED\ WARRANTIES,\ INCLUDING,\ BUT\ NOT\ LIMITED\ TO,\ THE\ IMPLIED\ WARRANTIES
|
|
OF\ MERCHANTABILITY\ AND\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\ ARE\ DISCLAIMED.
|
|
IN\ NO\ EVENT\ SHALL\ THE\ AUTHOR\ BE\ LIABLE\ FOR\ ANY\ DIRECT,\ INDIRECT,
|
|
INCIDENTAL,\ SPECIAL,\ EXEMPLARY,\ OR\ CONSEQUENTIAL\ DAMAGES\ (INCLUDING,\ BUT
|
|
NOT\ LIMITED\ TO,\ PROCUREMENT\ OF\ SUBSTITUTE\ GOODS\ OR\ SERVICES;\ LOSS\ OF\ USE,
|
|
DATA,\ OR\ PROFITS;\ OR\ BUSINESS\ INTERRUPTION)\ HOWEVER\ CAUSED\ AND\ ON\ ANY
|
|
THEORY\ OF\ LIABILITY,\ WHETHER\ IN\ CONTRACT,\ STRICT\ LIABILITY,\ OR\ TORT
|
|
(INCLUDING\ NEGLIGENCE\ OR\ OTHERWISE)\ ARISING\ IN\ ANY\ WAY\ OUT\ OF\ THE\ USE\ OF
|
|
THIS\ SOFTWARE,\ EVEN\ IF\ ADVISED\ OF\ THE\ POSSIBILITY\ OF\ SUCH\ DAMAGE.
|
|
\f[]
|
|
.fi
|
|
.SS libstudxml (http://www.codesynthesis.com/projects/libstudxml/)
|
|
.RS
|
|
.PP
|
|
MIT License (http://www.codesynthesis.com/licenses/mit.txt)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
Summary:\ Everything\ is\ licensed\ under\ the\ MIT\ License\ (text\ below).
|
|
|
|
Code\ found\ in\ the\ xml/details/expat/\ directory\ is\ distributed\ under
|
|
the\ MIT\ License\ (see\ the\ xml/details/expat/LICENSE\ file\ for\ copyright
|
|
information).
|
|
|
|
Code\ found\ in\ the\ xml/details/genx/\ directory\ is\ distributed\ under
|
|
the\ MIT\ License\ (see\ the\ xml/details/genx/LICENSE\ file\ for\ copyright
|
|
information).
|
|
|
|
The\ rest\ is\ Copyright\ (c)\ 2013\-2014\ Code\ Synthesis\ Tools\ CC\ and\ is
|
|
distributed\ under\ the\ MIT\ License:
|
|
|
|
Permission\ is\ hereby\ granted,\ free\ of\ charge,\ to\ any\ person\ obtaining
|
|
a\ copy\ of\ this\ software\ and\ associated\ documentation\ files\ (the
|
|
"Software"),\ to\ deal\ in\ the\ Software\ without\ restriction,\ including
|
|
without\ limitation\ the\ rights\ to\ use,\ copy,\ modify,\ merge,\ publish,
|
|
distribute,\ sublicense,\ and/or\ sell\ copies\ of\ the\ Software,\ and\ to
|
|
permit\ persons\ to\ whom\ the\ Software\ is\ furnished\ to\ do\ so,\ subject\ to
|
|
the\ following\ conditions:
|
|
|
|
The\ above\ copyright\ notice\ and\ this\ permission\ notice\ shall\ be\ included
|
|
in\ all\ copies\ or\ substantial\ portions\ of\ the\ Software.
|
|
|
|
THE\ SOFTWARE\ IS\ PROVIDED\ "AS\ IS",\ WITHOUT\ WARRANTY\ OF\ ANY\ KIND,
|
|
EXPRESS\ OR\ IMPLIED,\ INCLUDING\ BUT\ NOT\ LIMITED\ TO\ THE\ WARRANTIES\ OF
|
|
MERCHANTABILITY,\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\ AND\ NONINFRINGEMENT.
|
|
IN\ NO\ EVENT\ SHALL\ THE\ AUTHORS\ OR\ COPYRIGHT\ HOLDERS\ BE\ LIABLE\ FOR\ ANY
|
|
CLAIM,\ DAMAGES\ OR\ OTHER\ LIABILITY,\ WHETHER\ IN\ AN\ ACTION\ OF\ CONTRACT,
|
|
TORT\ OR\ OTHERWISE,\ ARISING\ FROM,\ OUT\ OF\ OR\ IN\ CONNECTION\ WITH\ THE
|
|
SOFTWARE\ OR\ THE\ USE\ OR\ OTHER\ DEALINGS\ IN\ THE\ SOFTWARE.
|
|
\f[]
|
|
.fi
|
|
.SS CxxTest (http://cxxtest.com/)
|
|
.RS
|
|
.PP
|
|
LGPL License (https://github.com/CxxTest/cxxtest/blob/master/COPYING)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ GNU\ LESSER\ GENERAL\ PUBLIC\ LICENSE
|
|
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Version\ 3,\ 29\ June\ 2007
|
|
|
|
\ Copyright\ (C)\ 2007\ Free\ Software\ Foundation,\ Inc.\ <http://fsf.org/>
|
|
\ Everyone\ is\ permitted\ to\ copy\ and\ distribute\ verbatim\ copies
|
|
\ of\ this\ license\ document,\ but\ changing\ it\ is\ not\ allowed.
|
|
|
|
|
|
\ \ This\ version\ of\ the\ GNU\ Lesser\ General\ Public\ License\ incorporates
|
|
the\ terms\ and\ conditions\ of\ version\ 3\ of\ the\ GNU\ General\ Public
|
|
License,\ supplemented\ by\ the\ additional\ permissions\ listed\ below.
|
|
|
|
\ \ 0.\ Additional\ Definitions.
|
|
|
|
\ \ As\ used\ herein,\ "this\ License"\ refers\ to\ version\ 3\ of\ the\ GNU\ Lesser
|
|
General\ Public\ License,\ and\ the\ "GNU\ GPL"\ refers\ to\ version\ 3\ of\ the\ GNU
|
|
General\ Public\ License.
|
|
|
|
\ \ "The\ Library"\ refers\ to\ a\ covered\ work\ governed\ by\ this\ License,
|
|
other\ than\ an\ Application\ or\ a\ Combined\ Work\ as\ defined\ below.
|
|
|
|
\ \ An\ "Application"\ is\ any\ work\ that\ makes\ use\ of\ an\ interface\ provided
|
|
by\ the\ Library,\ but\ which\ is\ not\ otherwise\ based\ on\ the\ Library.
|
|
Defining\ a\ subclass\ of\ a\ class\ defined\ by\ the\ Library\ is\ deemed\ a\ mode
|
|
of\ using\ an\ interface\ provided\ by\ the\ Library.
|
|
|
|
\ \ A\ "Combined\ Work"\ is\ a\ work\ produced\ by\ combining\ or\ linking\ an
|
|
Application\ with\ the\ Library.\ \ The\ particular\ version\ of\ the\ Library
|
|
with\ which\ the\ Combined\ Work\ was\ made\ is\ also\ called\ the\ "Linked
|
|
Version".
|
|
|
|
\ \ The\ "Minimal\ Corresponding\ Source"\ for\ a\ Combined\ Work\ means\ the
|
|
Corresponding\ Source\ for\ the\ Combined\ Work,\ excluding\ any\ source\ code
|
|
for\ portions\ of\ the\ Combined\ Work\ that,\ considered\ in\ isolation,\ are
|
|
based\ on\ the\ Application,\ and\ not\ on\ the\ Linked\ Version.
|
|
|
|
\ \ The\ "Corresponding\ Application\ Code"\ for\ a\ Combined\ Work\ means\ the
|
|
object\ code\ and/or\ source\ code\ for\ the\ Application,\ including\ any\ data
|
|
and\ utility\ programs\ needed\ for\ reproducing\ the\ Combined\ Work\ from\ the
|
|
Application,\ but\ excluding\ the\ System\ Libraries\ of\ the\ Combined\ Work.
|
|
|
|
\ \ 1.\ Exception\ to\ Section\ 3\ of\ the\ GNU\ GPL.
|
|
|
|
\ \ You\ may\ convey\ a\ covered\ work\ under\ sections\ 3\ and\ 4\ of\ this\ License
|
|
without\ being\ bound\ by\ section\ 3\ of\ the\ GNU\ GPL.
|
|
|
|
\ \ 2.\ Conveying\ Modified\ Versions.
|
|
|
|
\ \ If\ you\ modify\ a\ copy\ of\ the\ Library,\ and,\ in\ your\ modifications,\ a
|
|
facility\ refers\ to\ a\ function\ or\ data\ to\ be\ supplied\ by\ an\ Application
|
|
that\ uses\ the\ facility\ (other\ than\ as\ an\ argument\ passed\ when\ the
|
|
facility\ is\ invoked),\ then\ you\ may\ convey\ a\ copy\ of\ the\ modified
|
|
version:
|
|
|
|
\ \ \ a)\ under\ this\ License,\ provided\ that\ you\ make\ a\ good\ faith\ effort\ to
|
|
\ \ \ ensure\ that,\ in\ the\ event\ an\ Application\ does\ not\ supply\ the
|
|
\ \ \ function\ or\ data,\ the\ facility\ still\ operates,\ and\ performs
|
|
\ \ \ whatever\ part\ of\ its\ purpose\ remains\ meaningful,\ or
|
|
|
|
\ \ \ b)\ under\ the\ GNU\ GPL,\ with\ none\ of\ the\ additional\ permissions\ of
|
|
\ \ \ this\ License\ applicable\ to\ that\ copy.
|
|
|
|
\ \ 3.\ Object\ Code\ Incorporating\ Material\ from\ Library\ Header\ Files.
|
|
|
|
\ \ The\ object\ code\ form\ of\ an\ Application\ may\ incorporate\ material\ from
|
|
a\ header\ file\ that\ is\ part\ of\ the\ Library.\ \ You\ may\ convey\ such\ object
|
|
code\ under\ terms\ of\ your\ choice,\ provided\ that,\ if\ the\ incorporated
|
|
material\ is\ not\ limited\ to\ numerical\ parameters,\ data\ structure
|
|
layouts\ and\ accessors,\ or\ small\ macros,\ inline\ functions\ and\ templates
|
|
(ten\ or\ fewer\ lines\ in\ length),\ you\ do\ both\ of\ the\ following:
|
|
|
|
\ \ \ a)\ Give\ prominent\ notice\ with\ each\ copy\ of\ the\ object\ code\ that\ the
|
|
\ \ \ Library\ is\ used\ in\ it\ and\ that\ the\ Library\ and\ its\ use\ are
|
|
\ \ \ covered\ by\ this\ License.
|
|
|
|
\ \ \ b)\ Accompany\ the\ object\ code\ with\ a\ copy\ of\ the\ GNU\ GPL\ and\ this\ license
|
|
\ \ \ document.
|
|
|
|
\ \ 4.\ Combined\ Works.
|
|
|
|
\ \ You\ may\ convey\ a\ Combined\ Work\ under\ terms\ of\ your\ choice\ that,
|
|
taken\ together,\ effectively\ do\ not\ restrict\ modification\ of\ the
|
|
portions\ of\ the\ Library\ contained\ in\ the\ Combined\ Work\ and\ reverse
|
|
engineering\ for\ debugging\ such\ modifications,\ if\ you\ also\ do\ each\ of
|
|
the\ following:
|
|
|
|
\ \ \ a)\ Give\ prominent\ notice\ with\ each\ copy\ of\ the\ Combined\ Work\ that
|
|
\ \ \ the\ Library\ is\ used\ in\ it\ and\ that\ the\ Library\ and\ its\ use\ are
|
|
\ \ \ covered\ by\ this\ License.
|
|
|
|
\ \ \ b)\ Accompany\ the\ Combined\ Work\ with\ a\ copy\ of\ the\ GNU\ GPL\ and\ this\ license
|
|
\ \ \ document.
|
|
|
|
\ \ \ c)\ For\ a\ Combined\ Work\ that\ displays\ copyright\ notices\ during
|
|
\ \ \ execution,\ include\ the\ copyright\ notice\ for\ the\ Library\ among
|
|
\ \ \ these\ notices,\ as\ well\ as\ a\ reference\ directing\ the\ user\ to\ the
|
|
\ \ \ copies\ of\ the\ GNU\ GPL\ and\ this\ license\ document.
|
|
|
|
\ \ \ d)\ Do\ one\ of\ the\ following:
|
|
|
|
\ \ \ \ \ \ \ 0)\ Convey\ the\ Minimal\ Corresponding\ Source\ under\ the\ terms\ of\ this
|
|
\ \ \ \ \ \ \ License,\ and\ the\ Corresponding\ Application\ Code\ in\ a\ form
|
|
\ \ \ \ \ \ \ suitable\ for,\ and\ under\ terms\ that\ permit,\ the\ user\ to
|
|
\ \ \ \ \ \ \ recombine\ or\ relink\ the\ Application\ with\ a\ modified\ version\ of
|
|
\ \ \ \ \ \ \ the\ Linked\ Version\ to\ produce\ a\ modified\ Combined\ Work,\ in\ the
|
|
\ \ \ \ \ \ \ manner\ specified\ by\ section\ 6\ of\ the\ GNU\ GPL\ for\ conveying
|
|
\ \ \ \ \ \ \ Corresponding\ Source.
|
|
|
|
\ \ \ \ \ \ \ 1)\ Use\ a\ suitable\ shared\ library\ mechanism\ for\ linking\ with\ the
|
|
\ \ \ \ \ \ \ Library.\ \ A\ suitable\ mechanism\ is\ one\ that\ (a)\ uses\ at\ run\ time
|
|
\ \ \ \ \ \ \ a\ copy\ of\ the\ Library\ already\ present\ on\ the\ user\[aq]s\ computer
|
|
\ \ \ \ \ \ \ system,\ and\ (b)\ will\ operate\ properly\ with\ a\ modified\ version
|
|
\ \ \ \ \ \ \ of\ the\ Library\ that\ is\ interface\-compatible\ with\ the\ Linked
|
|
\ \ \ \ \ \ \ Version.
|
|
|
|
\ \ \ e)\ Provide\ Installation\ Information,\ but\ only\ if\ you\ would\ otherwise
|
|
\ \ \ be\ required\ to\ provide\ such\ information\ under\ section\ 6\ of\ the
|
|
\ \ \ GNU\ GPL,\ and\ only\ to\ the\ extent\ that\ such\ information\ is
|
|
\ \ \ necessary\ to\ install\ and\ execute\ a\ modified\ version\ of\ the
|
|
\ \ \ Combined\ Work\ produced\ by\ recombining\ or\ relinking\ the
|
|
\ \ \ Application\ with\ a\ modified\ version\ of\ the\ Linked\ Version.\ (If
|
|
\ \ \ you\ use\ option\ 4d0,\ the\ Installation\ Information\ must\ accompany
|
|
\ \ \ the\ Minimal\ Corresponding\ Source\ and\ Corresponding\ Application
|
|
\ \ \ Code.\ If\ you\ use\ option\ 4d1,\ you\ must\ provide\ the\ Installation
|
|
\ \ \ Information\ in\ the\ manner\ specified\ by\ section\ 6\ of\ the\ GNU\ GPL
|
|
\ \ \ for\ conveying\ Corresponding\ Source.)
|
|
|
|
\ \ 5.\ Combined\ Libraries.
|
|
|
|
\ \ You\ may\ place\ library\ facilities\ that\ are\ a\ work\ based\ on\ the
|
|
Library\ side\ by\ side\ in\ a\ single\ library\ together\ with\ other\ library
|
|
facilities\ that\ are\ not\ Applications\ and\ are\ not\ covered\ by\ this
|
|
License,\ and\ convey\ such\ a\ combined\ library\ under\ terms\ of\ your
|
|
choice,\ if\ you\ do\ both\ of\ the\ following:
|
|
|
|
\ \ \ a)\ Accompany\ the\ combined\ library\ with\ a\ copy\ of\ the\ same\ work\ based
|
|
\ \ \ on\ the\ Library,\ uncombined\ with\ any\ other\ library\ facilities,
|
|
\ \ \ conveyed\ under\ the\ terms\ of\ this\ License.
|
|
|
|
\ \ \ b)\ Give\ prominent\ notice\ with\ the\ combined\ library\ that\ part\ of\ it
|
|
\ \ \ is\ a\ work\ based\ on\ the\ Library,\ and\ explaining\ where\ to\ find\ the
|
|
\ \ \ accompanying\ uncombined\ form\ of\ the\ same\ work.
|
|
|
|
\ \ 6.\ Revised\ Versions\ of\ the\ GNU\ Lesser\ General\ Public\ License.
|
|
|
|
\ \ The\ Free\ Software\ Foundation\ may\ publish\ revised\ and/or\ new\ versions
|
|
of\ the\ GNU\ Lesser\ General\ Public\ License\ from\ time\ to\ time.\ Such\ new
|
|
versions\ will\ be\ similar\ in\ spirit\ to\ the\ present\ version,\ but\ may
|
|
differ\ in\ detail\ to\ address\ new\ problems\ or\ concerns.
|
|
|
|
\ \ Each\ version\ is\ given\ a\ distinguishing\ version\ number.\ If\ the
|
|
Library\ as\ you\ received\ it\ specifies\ that\ a\ certain\ numbered\ version
|
|
of\ the\ GNU\ Lesser\ General\ Public\ License\ "or\ any\ later\ version"
|
|
applies\ to\ it,\ you\ have\ the\ option\ of\ following\ the\ terms\ and
|
|
conditions\ either\ of\ that\ published\ version\ or\ of\ any\ later\ version
|
|
published\ by\ the\ Free\ Software\ Foundation.\ If\ the\ Library\ as\ you
|
|
received\ it\ does\ not\ specify\ a\ version\ number\ of\ the\ GNU\ Lesser
|
|
General\ Public\ License,\ you\ may\ choose\ any\ version\ of\ the\ GNU\ Lesser
|
|
General\ Public\ License\ ever\ published\ by\ the\ Free\ Software\ Foundation.
|
|
|
|
\ \ If\ the\ Library\ as\ you\ received\ it\ specifies\ that\ a\ proxy\ can\ decide
|
|
whether\ future\ versions\ of\ the\ GNU\ Lesser\ General\ Public\ License\ shall
|
|
apply,\ that\ proxy\[aq]s\ public\ statement\ of\ acceptance\ of\ any\ version\ is
|
|
permanent\ authorization\ for\ you\ to\ choose\ that\ version\ for\ the
|
|
Library.
|
|
\f[]
|
|
.fi
|
|
.SS PartIO (https://www.disneyanimation.com/technology/partio.html)
|
|
.RS
|
|
.PP
|
|
BSD 3\-Clause License (with specific non\-attribution
|
|
clause) (https://github.com/wdas/partio/blob/master/src/lib/io/ZIP.h)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
Copyright\ 2010\ Disney\ Enterprises,\ Inc.\ All\ rights\ reserved
|
|
|
|
Redistribution\ and\ use\ in\ source\ and\ binary\ forms,\ with\ or\ without
|
|
modification,\ are\ permitted\ provided\ that\ the\ following\ conditions\ are
|
|
met:
|
|
|
|
*\ Redistributions\ of\ source\ code\ must\ retain\ the\ above\ copyright
|
|
notice,\ this\ list\ of\ conditions\ and\ the\ following\ disclaimer.
|
|
|
|
*\ Redistributions\ in\ binary\ form\ must\ reproduce\ the\ above\ copyright
|
|
notice,\ this\ list\ of\ conditions\ and\ the\ following\ disclaimer\ in
|
|
the\ documentation\ and/or\ other\ materials\ provided\ with\ the
|
|
distribution.
|
|
|
|
*\ The\ names\ "Disney",\ "Walt\ Disney\ Pictures",\ "Walt\ Disney\ Animation
|
|
Studios"\ or\ the\ names\ of\ its\ contributors\ may\ NOT\ be\ used\ to
|
|
endorse\ or\ promote\ products\ derived\ from\ this\ software\ without
|
|
specific\ prior\ written\ permission\ from\ Walt\ Disney\ Pictures.
|
|
|
|
Disclaimer:\ THIS\ SOFTWARE\ IS\ PROVIDED\ BY\ WALT\ DISNEY\ PICTURES\ AND
|
|
CONTRIBUTORS\ "AS\ IS"\ AND\ ANY\ EXPRESS\ OR\ IMPLIED\ WARRANTIES,\ INCLUDING,
|
|
BUT\ NOT\ LIMITED\ TO,\ THE\ IMPLIED\ WARRANTIES\ OF\ MERCHANTABILITY,\ FITNESS
|
|
FOR\ A\ PARTICULAR\ PURPOSE,\ NONINFRINGEMENT\ AND\ TITLE\ ARE\ DISCLAIMED.
|
|
IN\ NO\ EVENT\ SHALL\ WALT\ DISNEY\ PICTURES,\ THE\ COPYRIGHT\ HOLDER\ OR
|
|
CONTRIBUTORS\ BE\ LIABLE\ FOR\ ANY\ DIRECT,\ INDIRECT,\ INCIDENTAL,\ SPECIAL,
|
|
EXEMPLARY,\ OR\ CONSEQUENTIAL\ DAMAGES\ (INCLUDING,\ BUT\ NOT\ LIMITED\ TO,
|
|
PROCUREMENT\ OF\ SUBSTITUTE\ GOODS\ OR\ SERVICES;\ LOSS\ OF\ USE,\ DATA,\ OR
|
|
PROFITS;\ OR\ BUSINESS\ INTERRUPTION)\ HOWEVER\ CAUSED\ AND\ BASED\ ON\ ANY
|
|
THEORY\ OF\ LIABILITY,\ WHETHER\ IN\ CONTRACT,\ STRICT\ LIABILITY,\ OR\ TORT
|
|
(INCLUDING\ NEGLIGENCE\ OR\ OTHERWISE)\ ARISING\ IN\ ANY\ WAY\ OUT\ OF\ THE\ USE
|
|
OF\ THIS\ SOFTWARE,\ EVEN\ IF\ ADVISED\ OF\ THE\ POSSIBILITY\ OF\ SUCH\ DAMAGES.
|
|
\f[]
|
|
.fi
|
|
.SS miniz (https://github.com/richgel999/miniz)
|
|
.RS
|
|
.PP
|
|
Public Domain/MIT
|
|
License (https://github.com/richgel999/miniz/blob/master/LICENSE)
|
|
.RE
|
|
.IP
|
|
.nf
|
|
\f[C]
|
|
This\ is\ free\ and\ unencumbered\ software\ released\ into\ the\ public\ domain.
|
|
|
|
Anyone\ is\ free\ to\ copy,\ modify,\ publish,\ use,\ compile,\ sell,\ or
|
|
distribute\ this\ software,\ either\ in\ source\ code\ form\ or\ as\ a\ compiled
|
|
binary,\ for\ any\ purpose,\ commercial\ or\ non\-commercial,\ and\ by\ any
|
|
means.
|
|
|
|
In\ jurisdictions\ that\ recognize\ copyright\ laws,\ the\ author\ or\ authors
|
|
of\ this\ software\ dedicate\ any\ and\ all\ copyright\ interest\ in\ the
|
|
software\ to\ the\ public\ domain.\ We\ make\ this\ dedication\ for\ the\ benefit
|
|
of\ the\ public\ at\ large\ and\ to\ the\ detriment\ of\ our\ heirs\ and
|
|
successors.\ We\ intend\ this\ dedication\ to\ be\ an\ overt\ act\ of
|
|
relinquishment\ in\ perpetuity\ of\ all\ present\ and\ future\ rights\ to\ this
|
|
software\ under\ copyright\ law.
|
|
|
|
THE\ SOFTWARE\ IS\ PROVIDED\ "AS\ IS",\ WITHOUT\ WARRANTY\ OF\ ANY\ KIND,
|
|
EXPRESS\ OR\ IMPLIED,\ INCLUDING\ BUT\ NOT\ LIMITED\ TO\ THE\ WARRANTIES\ OF
|
|
MERCHANTABILITY,\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\ AND\ NONINFRINGEMENT.
|
|
IN\ NO\ EVENT\ SHALL\ THE\ AUTHORS\ BE\ LIABLE\ FOR\ ANY\ CLAIM,\ DAMAGES\ OR
|
|
OTHER\ LIABILITY,\ WHETHER\ IN\ AN\ ACTION\ OF\ CONTRACT,\ TORT\ OR\ OTHERWISE,
|
|
ARISING\ FROM,\ OUT\ OF\ OR\ IN\ CONNECTION\ WITH\ THE\ SOFTWARE\ OR\ THE\ USE\ OR
|
|
OTHER\ DEALINGS\ IN\ THE\ SOFTWARE.
|
|
|
|
For\ more\ information,\ please\ refer\ to\ <http://unlicense.org/>
|
|
|
|
Copyright\ 2013\-2014\ RAD\ Game\ Tools\ and\ Valve\ Software
|
|
Copyright\ 2010\-2014\ Rich\ Geldreich\ and\ Tenacious\ Software\ LLC
|
|
All\ Rights\ Reserved.
|
|
|
|
Permission\ is\ hereby\ granted,\ free\ of\ charge,\ to\ any\ person\ obtaining\ a\ copy
|
|
of\ this\ software\ and\ associated\ documentation\ files\ (the\ "Software"),\ to\ deal
|
|
in\ the\ Software\ without\ restriction,\ including\ without\ limitation\ the\ rights
|
|
to\ use,\ copy,\ modify,\ merge,\ publish,\ distribute,\ sublicense,\ and/or\ sell
|
|
copies\ of\ the\ Software,\ and\ to\ permit\ persons\ to\ whom\ the\ Software\ is
|
|
furnished\ to\ do\ so,\ subject\ to\ the\ following\ conditions:
|
|
|
|
The\ above\ copyright\ notice\ and\ this\ permission\ notice\ shall\ be\ included\ in
|
|
all\ copies\ or\ substantial\ portions\ of\ the\ Software.
|
|
|
|
THE\ SOFTWARE\ IS\ PROVIDED\ "AS\ IS",\ WITHOUT\ WARRANTY\ OF\ ANY\ KIND,\ EXPRESS\ OR
|
|
IMPLIED,\ INCLUDING\ BUT\ NOT\ LIMITED\ TO\ THE\ WARRANTIES\ OF\ MERCHANTABILITY,
|
|
FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\ AND\ NONINFRINGEMENT.\ IN\ NO\ EVENT\ SHALL\ THE
|
|
AUTHORS\ OR\ COPYRIGHT\ HOLDERS\ BE\ LIABLE\ FOR\ ANY\ CLAIM,\ DAMAGES\ OR\ OTHER
|
|
LIABILITY,\ WHETHER\ IN\ AN\ ACTION\ OF\ CONTRACT,\ TORT\ OR\ OTHERWISE,\ ARISING\ FROM,
|
|
OUT\ OF\ OR\ IN\ CONNECTION\ WITH\ THE\ SOFTWARE\ OR\ THE\ USE\ OR\ OTHER\ DEALINGS\ IN
|
|
THE\ SOFTWARE.
|
|
\f[]
|
|
.fi
|