1 /* 2 * libxlsxwriter 3 * 4 * Copyright 2014-2016, John McNamara, jmcnamara@cpan.org. See LICENSE.txt. 5 */ 6 7 /** 8 * @file utility.h 9 * 10 * @brief Utility functions for libxlsxwriter. 11 * 12 * <!-- Copyright 2014-2016, John McNamara, jmcnamara@cpan.org --> 13 * 14 */ 15 module xlsxwriter.utility; 16 17 import std.stdio; 18 import core.stdc.stdint; 19 import xlsxwriter.common; 20 21 extern(C): 22 /* Max col: $XFD\0 */ 23 enum MAX_COL_NAME_LENGTH = 5; 24 25 /* Max cell: $XFWD$1048576\0 */ 26 enum MAX_CELL_NAME_LENGTH = 14; 27 28 /* Max range: $XFWD$1048576:$XFWD$1048576\0 */ 29 enum MAX_CELL_RANGE_LENGTH = MAX_CELL_NAME_LENGTH * 2; 30 31 enum EPOCH_1900 = 0; 32 enum EPOCH_1904 = 1; 33 34 /** 35 * @brief Convert an Excel `A1` cell string into a `(row, col)` pair. 36 * 37 * Convert an Excel `A1` cell string into a `(row, col)` pair. 38 * 39 * This is a little syntactic shortcut to help with worksheet layout: 40 * 41 * @code 42 * worksheet_write_string(worksheet, CELL("A1"), "Foo", NULL); 43 * 44 * //Same as: 45 * worksheet_write_string(worksheet, 0, 0, "Foo", NULL); 46 * @endcode 47 * 48 * @note 49 * 50 * This macro shouldn't be used in performance critical situations since it 51 * expands to two function calls. 52 */ 53 /* #define CELL(cell) \ */ 54 /* lxw_get_row(cell), lxw_get_col(cell) */ 55 56 auto CELL(string cellName) 57 { 58 import std.typecons; 59 import std..string : toStringz; 60 auto s = cellName.toStringz(); 61 return tuple(lxw_name_to_row(s), lxw_name_to_col(s)); 62 } 63 64 /** **/ 65 uint32_t lxw_name_to_row(const char *row_str); 66 uint32_t lxw_name_to_row_2(const char *row_str); 67 68 /** **/ 69 uint16_t lxw_name_to_col(const char *col_str); 70 uint16_t lxw_name_to_col_2(const char *col_str); 71 72 73 /** 74 * @brief Convert an Excel `A:B` column range into a `(col1, col2)` pair. 75 * 76 * Convert an Excel `A:B` column range into a `(col1, col2)` pair. 77 * 78 * This is a little syntactic shortcut to help with worksheet layout: 79 * 80 * @code 81 * worksheet_set_column(worksheet, COLS("B:D"), 20, NULL, NULL); 82 * 83 * // Same as: 84 * worksheet_set_column(worksheet, 1, 3, 20, NULL, NULL); 85 * @endcode 86 * 87 */ 88 /* #define COLS(cols) \ */ 89 /* lxw_get_col(cols), lxw_get_col_2(cols) */ 90 auto COLS(string colName) 91 { 92 import std.typecons; 93 import std..string : toStringz; 94 auto s = colName.toStringz(); 95 return tuple(lxw_name_to_col(s), lxw_name_to_col_2(s)); 96 } 97 98 /** 99 * @brief Convert an Excel `A1:B2` range into a `(first_row, first_col, 100 * last_row, last_col)` sequence. 101 * 102 * Convert an Excel `A1:B2` range into a `(first_row, first_col, last_row, 103 * last_col)` sequence. 104 * 105 * This is a little syntactic shortcut to help with worksheet layout. 106 * 107 * @code 108 * worksheet_print_area(worksheet, 0, 0, 41, 10); // A1:K42. 109 * 110 * // Same as: 111 * worksheet_print_area(worksheet, RANGE("A1:K42")); 112 * @endcode 113 */ 114 /* #define RANGE(range) \ */ 115 /* lxw_get_row(range), lxw_get_col(range), lxw_get_row_2(range), lxw_get_col_2(range) */ 116 auto RANGE(string rangeName) 117 { 118 import std.typecons; 119 import std..string : toStringz; 120 auto s = rangeName.toStringz(); 121 return tuple(lxw_name_to_row(s), lxw_name_to_col(s), 122 lxw_name_to_row_2(s), lxw_name_to_col_2(s)); 123 } 124 125 /** @brief Struct to represent a date and time in Excel. 126 * 127 * Struct to represent a date and time in Excel. See @ref working_with_dates. 128 */ 129 struct lxw_datetime { 130 131 /** Year : 1900 - 9999 */ 132 int year; 133 /** Month : 1 - 12 */ 134 int month; 135 /** Day : 1 - 31 */ 136 int day; 137 /** Hour : 0 - 23 */ 138 int hour; 139 /** Minute : 0 - 59 */ 140 int min; 141 /** Seconds : 0 - 59.999 */ 142 double sec; 143 } 144 145 /* Create a quoted version of the worksheet name */ 146 char *lxw_quote_sheetname(char *str); 147 148 void lxw_col_to_name(char *col_name, int col_num, uint8_t absolute); 149 150 void lxw_rowcol_to_cell(char *cell_name, int row, int col); 151 152 void lxw_rowcol_to_cell_abs(char *cell_name, 153 int row, 154 int col, uint8_t abs_row, uint8_t abs_col); 155 156 void lxw_range(char *range, 157 int first_row, int first_col, int last_row, int last_col); 158 159 void lxw_range_abs(char *range, 160 int first_row, int first_col, int last_row, int last_col); 161 162 double lxw_datetime_to_excel_date(lxw_datetime *datetime, uint8_t date_1904); 163 164 char *lxw_strdup(const char *str); 165 166 void lxw_str_tolower(char *str); 167 168 FILE *lxw_tmpfile(); 169 170 char* lxw_strerror(lxw_error error_num);