XlsxReaderWriter is an Swift 5 library for iPhone / iPad and Mac. It parses and writes MS Excel XLSX files.
libxlsxwriter is a C library. I tried various libraries but failed and eventually found a C library. The good news is that this library supports CocoaPods. Yeahh
For more, Please visit : http://libxlsxwriter.github.io/
A Python module for creating Excel XLSX files. https://xlsxwriter.readthedocs.io
See the full documentation at: https://xlsxwriter.readthedocs.io
Release notes: https://xlsxwriter.readthedocs.io/changes.html
Copyright 2014-2020 John McNamara. Generated by doxygen
XlsxWriter is a Python module for writing files in the Excel 2007+ XLSX file format.
XlsxWriter can be used to write text, numbers, formulas and hyperlinks to multiple worksheets and it supports features such as formatting and many more, including:
- 100% compatible Excel XLSX files.
- Full formatting.
- Merged cells.
- Defined names.
- Charts.
- Autofilters.
- Data validation and drop down lists.
- Conditional formatting.
- Worksheet PNG/JPEG/BMP/WMF/EMF images.
- Rich multi-format strings.
- Cell comments.
- Integration with Pandas.
- Textboxes.
- Support for adding Macros.
- Memory optimization mode for writing large files.
Here is a simple example:
.. code-block:: swift
import xlsxwriter
class ViewController: UIViewController {
//URL Path for physical location of excell sheet file
var url: URL? = nil
let preview = QLPreviewController()
override func viewDidLoad() {
super.viewDidLoad()
//Generate custom sheet
createSheet()
//self.btnViewSheetClicked(UIButton())
}
// MARK: Create Sheet
func createSheet() {
//get path to save file
let path = getPath(createFile: "Daily Export")
//Generate workbook
let workbook = workbook_new(path)
//Add one Sheet in workbook //You can add multiple sheet
let worksheet = workbook_add_worksheet(workbook, "Daily Export");
//Format : Means set properties to row, column & cell
let formatHeader = setupFormatHeader(using: workbook)
setupHeader(using: worksheet, myformatBold: formatHeader)
let formatRightAllign_Bold = setupFormatRightAllign_Bold(using: workbook)
let formatAllignCenter = setupFormatCenterAllign(using: workbook)
let formatNumber = setupNumberFormat(using: workbook)
let formatText = setupFormatText(using: workbook)
//Get dymmy data to display it in Sheet
let arrTrips = GenerateTrip.shared.getTrips(10)
for (index, trip) in arrTrips.enumerated() {
//Set Serial number
let serialNumber = index + 2
let row = lxw_row_t(serialNumber)
//Set custom width to column
worksheet_set_row(worksheet, 0, 30, formatAllignCenter)
worksheet_set_column(worksheet, 0, 0, 8, formatAllignCenter)
worksheet_set_column(worksheet, 1, 1, 30, nil)
worksheet_set_column(worksheet, 2, 2, 20, nil)
worksheet_set_column(worksheet, 3, 3, 30, nil)
worksheet_set_column(worksheet, 4, 4, 20, nil)
worksheet_set_column(worksheet, 5, 5, 30, nil)
worksheet_set_column(worksheet, 6, 6, 8, formatAllignCenter)
worksheet_set_column(worksheet, 7, 7, 8, formatAllignCenter)
//Set Data/Value in Cell
//For number, we use : worksheet_write_number
//For String, we use : worksheet_write_string
worksheet_write_number(worksheet, row, 0, Double(trip.serialNumber), nil)
worksheet_write_string(worksheet, row, 1, "\(trip.date.toString(style: DateStyleType.long))", formatText)
//Deprture
worksheet_write_string(worksheet, row, 2, "\(trip.departure.city)", formatText)
worksheet_write_string(worksheet, row, 3, "\(trip.departure.address)", formatText)
//Arrival
worksheet_write_string(worksheet, row, 4, "\(trip.arrival.city)", formatText)
worksheet_write_string(worksheet, row, 5, "\(trip.arrival.address)", formatText)
worksheet_write_number(worksheet, row, 6, trip.kms, formatNumber)
worksheet_write_number(worksheet, row, 7, trip.miles, formatNumber)
//Set sum
let sumOfKMS = arrTrips.map({ $0.kms}).reduce(0.0, +)
let sumOfMiles = arrTrips.map({ $0.miles}).reduce(0.0, +)
worksheet_write_number(worksheet, row+1, 6, sumOfKMS, formatNumber)
worksheet_write_number(worksheet, row+1, 7, sumOfMiles, formatNumber)
}
//Merge cell
let rowTotal = lxw_row_t(arrTrips.count+2)
let colTotal = lxw_col_t(5)
worksheet_merge_range(worksheet, rowTotal, lxw_col_t(0), rowTotal, colTotal, "Total", formatRightAllign_Bold)
//Save and close editing & generate physical file in document directory, If already exist then It will replace it
workbook_close(workbook)
}
func getPath(createFile fileName: String) -> UnsafePointer<Int8> {
url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(fileName).appendingPathExtension("xlsx")
let path = NSString(string: url!.path).fileSystemRepresentation
print("path:", url!.absoluteString)
return path
}
//IBActions for button 'View Sheet'
@IBAction func btnViewSheetClicked(_ sender: UIButton) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.preview.dataSource = self
self.preview.currentPreviewItemIndex = 0
self.present(self.preview, animated: true)
}
}
}
// MARK: Set theme, Text, Allignment, Width, Style, Etc using lxw_format
extension ViewController {
func setupFormatText(using workbook: UnsafeMutablePointer<lxw_workbook>?) -> UnsafeMutablePointer<lxw_format>? {
let myformatNormal = workbook_add_format(workbook)
format_set_align(myformatNormal, UInt8(LXW_ALIGN_VERTICAL_DISTRIBUTED.rawValue))
format_set_text_wrap(myformatNormal);
return myformatNormal
}
func setupFormatHeader(using workbook: UnsafeMutablePointer<lxw_workbook>?) -> UnsafeMutablePointer<lxw_format>? {
let format = workbook_add_format(workbook)
format_set_bold(format)
format_set_align(format, UInt8(LXW_ALIGN_CENTER_ACROSS.rawValue))
return format
}
func setupFormatRightAllign_Bold(using workbook: UnsafeMutablePointer<lxw_workbook>?) -> UnsafeMutablePointer<lxw_format>? {
let format = workbook_add_format(workbook)
format_set_bold(format)
format_set_align(format, UInt8(LXW_ALIGN_RIGHT.rawValue))
return format
}
func setupFormatCenterAllign(using workbook: UnsafeMutablePointer<lxw_workbook>?) -> UnsafeMutablePointer<lxw_format>? {
let format = workbook_add_format(workbook)
// format_set_align(format, UInt8(LXW_ALIGN_CENTER.rawValue))
// format_set_align(format, UInt8(LXW_ALIGN_VERTICAL_CENTER.rawValue))
format_set_align(format, UInt8(LXW_ALIGN_CENTER_ACROSS.rawValue))
return format
}
func setupNumberFormat(using workbook: UnsafeMutablePointer<lxw_workbook>?) -> UnsafeMutablePointer<lxw_format>? {
let formatDouble = workbook_add_format(workbook)
format_set_num_format(formatDouble, "0.00");
return formatDouble
}
func setupHeader(using
worksheet: UnsafeMutablePointer<lxw_worksheet>?,
myformatBold: UnsafeMutablePointer<lxw_format>?) {
//Set Columb
worksheet_write_string(worksheet, 0, 0, "Serial No.", myformatBold)
worksheet_write_string(worksheet, 0, 1, "Date", myformatBold)
worksheet_write_string(worksheet, 0, 2, "Departure", myformatBold)
worksheet_write_string(worksheet, 0, 3, "", myformatBold)
worksheet_write_string(worksheet, 0, 4, "Arrival", myformatBold)
worksheet_write_string(worksheet, 0, 5, "", myformatBold)
worksheet_write_string(worksheet, 1, 6, "Kms", myformatBold)
worksheet_write_string(worksheet, 1, 7, "Miles", myformatBold)
worksheet_write_string(worksheet, 1, 2, "City", myformatBold)
worksheet_write_string(worksheet, 1, 3, "Address", myformatBold)
worksheet_write_string(worksheet, 1, 4, "City", myformatBold)
worksheet_write_string(worksheet, 1, 5, "Address", myformatBold)
worksheet_merge_range(worksheet, 0, 0, 1, 0, "Serial No.", myformatBold)
worksheet_merge_range(worksheet, 0, 1, 1, 1, "Date", myformatBold)
worksheet_merge_range(worksheet, 0, 6, 1, 6, "Kms", myformatBold)
worksheet_merge_range(worksheet, 0, 7, 1, 7, "Miles", myformatBold)
//worksheet_merge_range(worksheet, 0, 2, 0, 3, "Departure", myformatBold)
//worksheet_merge_range(worksheet, 0, 4, 0, 5, "Arrival", myformatBold)
}
}
..
See the full documentation at: https://xlsxwriter.readthedocs.io
Release notes: https://xlsxwriter.readthedocs.io/changes.html