excel_format_converter.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /**
  2. * DevExtreme (exporter/excel_format_converter.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _string = require("../core/utils/string");
  11. var _string2 = _interopRequireDefault(_string);
  12. var _number = require("../localization/number");
  13. var _number2 = _interopRequireDefault(_number);
  14. var _date = require("../localization/date");
  15. var _date2 = _interopRequireDefault(_date);
  16. var _type = require("../core/utils/type");
  17. var _date3 = require("../localization/ldml/date.format");
  18. var _language_codes = require("../localization/language_codes");
  19. require("../localization/currency");
  20. function _interopRequireDefault(obj) {
  21. return obj && obj.__esModule ? obj : {
  22. "default": obj
  23. }
  24. }
  25. var ARABIC_ZERO_CODE = 1632;
  26. var DEFINED_NUMBER_FORMTATS = {
  27. thousands: "#,##0{0},"K"",
  28. millions: "#,##0{0},,"M"",
  29. billions: "#,##0{0},,,"B"",
  30. trillions: "#,##0{0},,,,"T"",
  31. percent: "0{0}%",
  32. decimal: "#{0}",
  33. fixedpoint: "#,##0{0}",
  34. exponential: "0{0}E+00",
  35. currency: " "
  36. };
  37. var PERIOD_REGEXP = /a+/g;
  38. var DAY_REGEXP = /E/g;
  39. var DO_REGEXP = /dE+/g;
  40. var STANDALONE_MONTH_REGEXP = /L/g;
  41. var HOUR_REGEXP = /h/g;
  42. var SLASH_REGEXP = /\//g;
  43. var SQUARE_OPEN_BRACKET_REGEXP = /\[/g;
  44. var SQUARE_CLOSE_BRACKET_REGEXP = /]/g;
  45. var ANY_REGEXP = /./g;
  46. var excelFormatConverter = module.exports = {
  47. _applyPrecision: function(format, precision) {
  48. var result;
  49. var i;
  50. if (precision > 0) {
  51. result = "decimal" !== format ? "." : "";
  52. for (i = 0; i < precision; i++) {
  53. result += "0"
  54. }
  55. return result
  56. }
  57. return ""
  58. },
  59. _hasArabicDigits: function(text) {
  60. var code;
  61. for (var i = 0; i < text.length; i++) {
  62. code = text.charCodeAt(i);
  63. if (code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10) {
  64. return true
  65. }
  66. }
  67. return false
  68. },
  69. _convertDateFormatToOpenXml: function(format) {
  70. return format.replace(SLASH_REGEXP, "\\/").split("'").map(function(datePart, index) {
  71. if (index % 2 === 0) {
  72. return datePart.replace(PERIOD_REGEXP, "AM/PM").replace(DO_REGEXP, "d").replace(DAY_REGEXP, "d").replace(STANDALONE_MONTH_REGEXP, "M").replace(HOUR_REGEXP, "H").replace(SQUARE_OPEN_BRACKET_REGEXP, "\\[").replace(SQUARE_CLOSE_BRACKET_REGEXP, "\\]")
  73. }
  74. if (datePart) {
  75. return datePart.replace(ANY_REGEXP, "\\$&")
  76. }
  77. return "'"
  78. }).join("")
  79. },
  80. _convertDateFormat: function(format) {
  81. var formattedValue = (_date2.default.format(new Date(2009, 8, 8, 6, 5, 4), format) || "").toString();
  82. var result = (0, _date3.getFormat)(function(value) {
  83. return _date2.default.format(value, format)
  84. });
  85. if (result) {
  86. result = this._convertDateFormatToOpenXml(result);
  87. result = this._getLanguageInfo(formattedValue) + result
  88. }
  89. return result
  90. },
  91. _getLanguageInfo: function(defaultPattern) {
  92. var languageID = (0, _language_codes.getLanguageId)();
  93. var languageIDStr = languageID ? languageID.toString(16) : "";
  94. var languageInfo = "";
  95. if (this._hasArabicDigits(defaultPattern)) {
  96. while (languageIDStr.length < 3) {
  97. languageIDStr = "0" + languageIDStr
  98. }
  99. languageInfo = "[$-2010" + languageIDStr + "]"
  100. } else {
  101. if (languageIDStr) {
  102. languageInfo = "[$-" + languageIDStr + "]"
  103. }
  104. }
  105. return languageInfo
  106. },
  107. _convertNumberFormat: function(format, precision, currency) {
  108. var result;
  109. var excelFormat;
  110. if ("currency" === format) {
  111. excelFormat = _number2.default.getOpenXmlCurrencyFormat(currency)
  112. } else {
  113. excelFormat = DEFINED_NUMBER_FORMTATS[format.toLowerCase()]
  114. }
  115. if (excelFormat) {
  116. result = _string2.default.format(excelFormat, this._applyPrecision(format, precision))
  117. }
  118. return result
  119. },
  120. convertFormat: function(format, precision, type, currency) {
  121. if ((0, _type.isDefined)(format)) {
  122. if ("date" === type) {
  123. return excelFormatConverter._convertDateFormat(format)
  124. } else {
  125. if ((0, _type.isString)(format) && DEFINED_NUMBER_FORMTATS[format.toLowerCase()]) {
  126. return excelFormatConverter._convertNumberFormat(format, precision, currency)
  127. }
  128. }
  129. }
  130. }
  131. };