write_xlsx 1.11.1 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/Changes +9 -0
- data/README.md +1 -1
- data/examples/shape_all.rb +1 -1
- data/lib/write_xlsx/chart/pie.rb +14 -2
- data/lib/write_xlsx/chart/series.rb +48 -0
- data/lib/write_xlsx/chart.rb +65 -12
- data/lib/write_xlsx/chartsheet.rb +10 -1
- data/lib/write_xlsx/col_name.rb +7 -3
- data/lib/write_xlsx/format.rb +6 -6
- data/lib/write_xlsx/package/app.rb +9 -5
- data/lib/write_xlsx/package/conditional_format.rb +2 -2
- data/lib/write_xlsx/package/content_types.rb +22 -0
- data/lib/write_xlsx/package/metadata.rb +139 -22
- data/lib/write_xlsx/package/packager.rb +122 -6
- data/lib/write_xlsx/package/relationships.rb +25 -0
- data/lib/write_xlsx/package/rich_value.rb +70 -0
- data/lib/write_xlsx/package/rich_value_rel.rb +70 -0
- data/lib/write_xlsx/package/rich_value_structure.rb +83 -0
- data/lib/write_xlsx/package/rich_value_types.rb +103 -0
- data/lib/write_xlsx/package/table.rb +74 -20
- data/lib/write_xlsx/package/xml_writer_simple.rb +32 -44
- data/lib/write_xlsx/sheets.rb +6 -2
- data/lib/write_xlsx/sparkline.rb +2 -2
- data/lib/write_xlsx/utility.rb +183 -9
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +48 -168
- data/lib/write_xlsx/worksheet/cell_data.rb +35 -16
- data/lib/write_xlsx/worksheet/hyperlink.rb +4 -3
- data/lib/write_xlsx/worksheet.rb +180 -57
- data/write_xlsx.gemspec +2 -0
- metadata +35 -3
data/lib/write_xlsx/worksheet.rb
CHANGED
@@ -113,7 +113,8 @@ module Writexlsx
|
|
113
113
|
@drawing_rels_id = 0
|
114
114
|
@vml_drawing_rels = {}
|
115
115
|
@vml_drawing_rels_id = 0
|
116
|
-
@
|
116
|
+
@has_dynamic_functions = false
|
117
|
+
@has_embedded_images = false
|
117
118
|
|
118
119
|
@use_future_functions = false
|
119
120
|
|
@@ -160,6 +161,8 @@ module Writexlsx
|
|
160
161
|
@page_setup.margin_footer = 0.5
|
161
162
|
@page_setup.header_footer_aligns = false
|
162
163
|
end
|
164
|
+
|
165
|
+
@embedded_image_indexes = @workbook.embedded_image_indexes
|
163
166
|
end
|
164
167
|
|
165
168
|
def set_xml_writer(filename) # :nodoc:
|
@@ -228,15 +231,26 @@ module Writexlsx
|
|
228
231
|
#
|
229
232
|
# Hide this worksheet.
|
230
233
|
#
|
231
|
-
def hide
|
232
|
-
@hidden =
|
234
|
+
def hide(hidden = :hidden)
|
235
|
+
@hidden = hidden
|
233
236
|
@selected = false
|
234
237
|
@workbook.activesheet = 0 if @workbook.activesheet == @index
|
235
238
|
@workbook.firstsheet = 0 if @workbook.firstsheet == @index
|
236
239
|
end
|
237
240
|
|
241
|
+
#
|
242
|
+
# Hide this worksheet. This can only be unhidden from VBA.
|
243
|
+
#
|
244
|
+
def very_hidden
|
245
|
+
hide(:very_hidden)
|
246
|
+
end
|
247
|
+
|
238
248
|
def hidden? # :nodoc:
|
239
|
-
@hidden
|
249
|
+
@hidden == :hidden
|
250
|
+
end
|
251
|
+
|
252
|
+
def very_hidden? # :nodoc:
|
253
|
+
@hidden == :very_hidden
|
240
254
|
end
|
241
255
|
|
242
256
|
#
|
@@ -271,7 +285,7 @@ module Writexlsx
|
|
271
285
|
if range.nil?
|
272
286
|
raise "The range must be defined in unprotect_range())\n"
|
273
287
|
else
|
274
|
-
range = range.gsub(
|
288
|
+
range = range.gsub("$", "")
|
275
289
|
range = range.sub(/^=/, "")
|
276
290
|
@num_protected_ranges += 1
|
277
291
|
end
|
@@ -612,8 +626,17 @@ module Writexlsx
|
|
612
626
|
#
|
613
627
|
# This method is used to display the worksheet in "Page View/Layout" mode.
|
614
628
|
#
|
615
|
-
def set_page_view(flag =
|
616
|
-
@page_view =
|
629
|
+
def set_page_view(flag = 1)
|
630
|
+
@page_view = flag
|
631
|
+
end
|
632
|
+
|
633
|
+
#
|
634
|
+
# set_pagebreak_view
|
635
|
+
#
|
636
|
+
# Set the page view mode.
|
637
|
+
#
|
638
|
+
def set_pagebreak_view
|
639
|
+
@page_view = 2
|
617
640
|
end
|
618
641
|
|
619
642
|
#
|
@@ -648,7 +671,7 @@ module Writexlsx
|
|
648
671
|
raise 'Header string must be less than 255 characters' if string.length > 255
|
649
672
|
|
650
673
|
# Replace the Excel placeholder &[Picture] with the internal &G.
|
651
|
-
@page_setup.header = string.gsub(
|
674
|
+
@page_setup.header = string.gsub("&[Picture]", '&G')
|
652
675
|
|
653
676
|
@page_setup.header_footer_aligns = options[:align_with_margins] if options[:align_with_margins]
|
654
677
|
|
@@ -664,7 +687,7 @@ module Writexlsx
|
|
664
687
|
end
|
665
688
|
|
666
689
|
# placeholeder /&G/ の数
|
667
|
-
placeholder_count = @page_setup.header.scan(
|
690
|
+
placeholder_count = @page_setup.header.scan("&G").count
|
668
691
|
|
669
692
|
image_count = @header_images.count
|
670
693
|
|
@@ -685,7 +708,7 @@ module Writexlsx
|
|
685
708
|
@page_setup.footer = string.dup
|
686
709
|
|
687
710
|
# Replace the Excel placeholder &[Picture] with the internal &G.
|
688
|
-
@page_setup.footer = string.gsub(
|
711
|
+
@page_setup.footer = string.gsub("&[Picture]", '&G')
|
689
712
|
|
690
713
|
@page_setup.header_footer_aligns = options[:align_with_margins] if options[:align_with_margins]
|
691
714
|
|
@@ -701,7 +724,7 @@ module Writexlsx
|
|
701
724
|
end
|
702
725
|
|
703
726
|
# placeholeder /&G/ の数
|
704
|
-
placeholder_count = @page_setup.footer.scan(
|
727
|
+
placeholder_count = @page_setup.footer.scan("&G").count
|
705
728
|
|
706
729
|
image_count = @footer_images.count
|
707
730
|
|
@@ -1320,7 +1343,7 @@ module Writexlsx
|
|
1320
1343
|
# Utility method to strip equal sign and array braces from a formula
|
1321
1344
|
# and also expand out future and dynamic array formulas.
|
1322
1345
|
#
|
1323
|
-
def prepare_formula(given_formula)
|
1346
|
+
def prepare_formula(given_formula, expand_future_functions = nil)
|
1324
1347
|
# Ignore empty/null formulas.
|
1325
1348
|
return given_formula unless ptrue?(given_formula)
|
1326
1349
|
|
@@ -1331,26 +1354,46 @@ module Writexlsx
|
|
1331
1354
|
return formula if formula =~ /_xlfn\./
|
1332
1355
|
|
1333
1356
|
# Expand dynamic array formulas.
|
1334
|
-
formula = expand_formula(formula, '
|
1357
|
+
formula = expand_formula(formula, 'ANCHORARRAY\(')
|
1358
|
+
formula = expand_formula(formula, 'BYCOL\(')
|
1359
|
+
formula = expand_formula(formula, 'BYROW\(')
|
1360
|
+
formula = expand_formula(formula, 'CHOOSECOLS\(')
|
1361
|
+
formula = expand_formula(formula, 'CHOOSEROWS\(')
|
1362
|
+
formula = expand_formula(formula, 'DROP\(')
|
1363
|
+
formula = expand_formula(formula, 'EXPAND\(')
|
1364
|
+
formula = expand_formula(formula, 'FILTER\(', '._xlws')
|
1365
|
+
formula = expand_formula(formula, 'HSTACK\(')
|
1335
1366
|
formula = expand_formula(formula, 'LAMBDA\(')
|
1367
|
+
formula = expand_formula(formula, 'MAKEARRAY\(')
|
1368
|
+
formula = expand_formula(formula, 'MAP\(')
|
1369
|
+
formula = expand_formula(formula, 'RANDARRAY\(')
|
1370
|
+
formula = expand_formula(formula, 'REDUCE\(')
|
1371
|
+
formula = expand_formula(formula, 'SCAN\(')
|
1372
|
+
formula = expand_formula(formula, 'SEQUENCE\(')
|
1336
1373
|
formula = expand_formula(formula, 'SINGLE\(')
|
1374
|
+
formula = expand_formula(formula, 'SORT\(', '._xlws')
|
1337
1375
|
formula = expand_formula(formula, 'SORTBY\(')
|
1376
|
+
formula = expand_formula(formula, 'SWITCH\(')
|
1377
|
+
formula = expand_formula(formula, 'TAKE\(')
|
1378
|
+
formula = expand_formula(formula, 'TEXTSPLIT\(')
|
1379
|
+
formula = expand_formula(formula, 'TOCOL\(')
|
1380
|
+
formula = expand_formula(formula, 'TOROW\(')
|
1338
1381
|
formula = expand_formula(formula, 'UNIQUE\(')
|
1339
|
-
formula = expand_formula(formula, '
|
1382
|
+
formula = expand_formula(formula, 'VSTACK\(')
|
1383
|
+
formula = expand_formula(formula, 'WRAPCOLS\(')
|
1384
|
+
formula = expand_formula(formula, 'WRAPROWS\(')
|
1340
1385
|
formula = expand_formula(formula, 'XLOOKUP\(')
|
1341
|
-
formula = expand_formula(formula, 'SEQUENCE\(')
|
1342
|
-
formula = expand_formula(formula, 'RANDARRAY\(')
|
1343
|
-
formula = expand_formula(formula, 'SORT\(', '._xlws')
|
1344
|
-
formula = expand_formula(formula, 'ANCHORARRAY\(')
|
1345
|
-
formula = expand_formula(formula, 'FILTER\(', '._xlws')
|
1346
1386
|
|
1347
|
-
|
1387
|
+
if !@use_future_functions && !ptrue?(expand_future_functions)
|
1388
|
+
return formula
|
1389
|
+
end
|
1348
1390
|
|
1349
1391
|
# Future functions.
|
1350
1392
|
formula = expand_formula(formula, 'ACOTH\(')
|
1351
1393
|
formula = expand_formula(formula, 'ACOT\(')
|
1352
1394
|
formula = expand_formula(formula, 'AGGREGATE\(')
|
1353
1395
|
formula = expand_formula(formula, 'ARABIC\(')
|
1396
|
+
formula = expand_formula(formula, 'ARRAYTOTEXT\(')
|
1354
1397
|
formula = expand_formula(formula, 'BASE\(')
|
1355
1398
|
formula = expand_formula(formula, 'BETA.DIST\(')
|
1356
1399
|
formula = expand_formula(formula, 'BETA.INV\(')
|
@@ -1406,6 +1449,7 @@ module Writexlsx
|
|
1406
1449
|
formula = expand_formula(formula, 'HYPGEOM.DIST\(')
|
1407
1450
|
formula = expand_formula(formula, 'IFNA\(')
|
1408
1451
|
formula = expand_formula(formula, 'IFS\(')
|
1452
|
+
formula = expand_formula(formula, 'IMAGE\(')
|
1409
1453
|
formula = expand_formula(formula, 'IMCOSH\(')
|
1410
1454
|
formula = expand_formula(formula, 'IMCOT\(')
|
1411
1455
|
formula = expand_formula(formula, 'IMCSCH\(')
|
@@ -1415,7 +1459,9 @@ module Writexlsx
|
|
1415
1459
|
formula = expand_formula(formula, 'IMSINH\(')
|
1416
1460
|
formula = expand_formula(formula, 'IMTAN\(')
|
1417
1461
|
formula = expand_formula(formula, 'ISFORMULA\(')
|
1462
|
+
formula = expand_formula(formula, 'ISOMITTED\(')
|
1418
1463
|
formula = expand_formula(formula, 'ISOWEEKNUM\(')
|
1464
|
+
formula = expand_formula(formula, 'LET\(')
|
1419
1465
|
formula = expand_formula(formula, 'LOGNORM.DIST\(')
|
1420
1466
|
formula = expand_formula(formula, 'LOGNORM.INV\(')
|
1421
1467
|
formula = expand_formula(formula, 'MAXIFS\(')
|
@@ -1450,24 +1496,26 @@ module Writexlsx
|
|
1450
1496
|
formula = expand_formula(formula, 'SKEW.P\(')
|
1451
1497
|
formula = expand_formula(formula, 'STDEV.P\(')
|
1452
1498
|
formula = expand_formula(formula, 'STDEV.S\(')
|
1453
|
-
formula = expand_formula(formula, 'SWITCH\(')
|
1454
1499
|
formula = expand_formula(formula, 'T.DIST.2T\(')
|
1455
1500
|
formula = expand_formula(formula, 'T.DIST.RT\(')
|
1456
1501
|
formula = expand_formula(formula, 'T.DIST\(')
|
1457
1502
|
formula = expand_formula(formula, 'T.INV.2T\(')
|
1458
1503
|
formula = expand_formula(formula, 'T.INV\(')
|
1459
1504
|
formula = expand_formula(formula, 'T.TEST\(')
|
1505
|
+
formula = expand_formula(formula, 'TEXTAFTER\(')
|
1506
|
+
formula = expand_formula(formula, 'TEXTBEFORE\(')
|
1460
1507
|
formula = expand_formula(formula, 'TEXTJOIN\(')
|
1461
1508
|
formula = expand_formula(formula, 'UNICHAR\(')
|
1462
1509
|
formula = expand_formula(formula, 'UNICODE\(')
|
1510
|
+
formula = expand_formula(formula, 'VALUETOTEXT\(')
|
1463
1511
|
formula = expand_formula(formula, 'VAR.P\(')
|
1464
1512
|
formula = expand_formula(formula, 'VAR.S\(')
|
1465
1513
|
formula = expand_formula(formula, 'WEBSERVICE\(')
|
1466
1514
|
formula = expand_formula(formula, 'WEIBULL.DIST\(')
|
1515
|
+
formula = expand_formula(formula, 'XMATCH\(')
|
1467
1516
|
formula = expand_formula(formula, 'XOR\(')
|
1468
1517
|
expand_formula(formula, 'Z.TEST\(')
|
1469
1518
|
end
|
1470
|
-
private :prepare_formula
|
1471
1519
|
|
1472
1520
|
#
|
1473
1521
|
# :call-seq:
|
@@ -1492,7 +1540,7 @@ module Writexlsx
|
|
1492
1540
|
raise WriteXLSXInsufficientArgumentError if [_row, _col, _formula].include?(nil)
|
1493
1541
|
|
1494
1542
|
# Check for dynamic array functions.
|
1495
|
-
regex = /\
|
1543
|
+
regex = /\bANCHORARRAY\(|\bBYCOL\(|\bBYROW\(|\bCHOOSECOLS\(|\bCHOOSEROWS\(|\bDROP\(|\bEXPAND\(|\bFILTER\(|\bHSTACK\(|\bLAMBDA\(|\bMAKEARRAY\(|\bMAP\(|\bRANDARRAY\(|\bREDUCE\(|\bSCAN\(|\bSEQUENCE\(|\bSINGLE\(|\bSORT\(|\bSORTBY\(|\bSWITCH\(|\bTAKE\(|\bTEXTSPLIT\(|\bTOCOL\(|\bTOROW\(|\bUNIQUE\(|\bVSTACK\(|\bWRAPCOLS\(|\bWRAPROWS\(|\bXLOOKUP\(/
|
1496
1544
|
if _formula =~ regex
|
1497
1545
|
return write_dynamic_array_formula(
|
1498
1546
|
_row, _col, _row, _col, _formula, _format, _value
|
@@ -1505,7 +1553,7 @@ module Writexlsx
|
|
1505
1553
|
else
|
1506
1554
|
check_dimensions(_row, _col)
|
1507
1555
|
store_row_col_max_min_values(_row, _col)
|
1508
|
-
_formula = _formula
|
1556
|
+
_formula = prepare_formula(_formula)
|
1509
1557
|
|
1510
1558
|
store_data_to_table(FormulaCellData.new(_formula, _format, _value), _row, _col)
|
1511
1559
|
end
|
@@ -1551,7 +1599,7 @@ module Writexlsx
|
|
1551
1599
|
end
|
1552
1600
|
|
1553
1601
|
# Modify the formula string, as needed.
|
1554
|
-
formula = prepare_formula(formula)
|
1602
|
+
formula = prepare_formula(formula, 1)
|
1555
1603
|
|
1556
1604
|
store_data_to_table(
|
1557
1605
|
if type == 'a'
|
@@ -1590,7 +1638,7 @@ module Writexlsx
|
|
1590
1638
|
#
|
1591
1639
|
def write_dynamic_array_formula(row1, col1, row2 = nil, col2 = nil, formula = nil, format = nil, value = nil)
|
1592
1640
|
write_array_formula_base('d', row1, col1, row2, col2, formula, format, value)
|
1593
|
-
@
|
1641
|
+
@has_dynamic_functions = true
|
1594
1642
|
end
|
1595
1643
|
|
1596
1644
|
#
|
@@ -1738,21 +1786,23 @@ module Writexlsx
|
|
1738
1786
|
# The label is written using the {#write()}[#method-i-write] method. Therefore it is
|
1739
1787
|
# possible to write strings, numbers or formulas as labels.
|
1740
1788
|
#
|
1741
|
-
def write_url(row, col, url = nil, format = nil, str = nil, tip = nil)
|
1789
|
+
def write_url(row, col, url = nil, format = nil, str = nil, tip = nil, ignore_write_string = false)
|
1742
1790
|
# Check for a cell reference in A1 notation and substitute row and column
|
1743
1791
|
if (row_col_array = row_col_notation(row))
|
1744
|
-
_row, _col
|
1745
|
-
_url
|
1746
|
-
_format
|
1747
|
-
_str
|
1748
|
-
_tip
|
1792
|
+
_row, _col = row_col_array
|
1793
|
+
_url = col
|
1794
|
+
_format = url
|
1795
|
+
_str = format
|
1796
|
+
_tip = str
|
1797
|
+
_ignore_write_string = tip
|
1749
1798
|
else
|
1750
|
-
_row
|
1751
|
-
_col
|
1752
|
-
_url
|
1753
|
-
_format
|
1754
|
-
_str
|
1755
|
-
_tip
|
1799
|
+
_row = row
|
1800
|
+
_col = col
|
1801
|
+
_url = url
|
1802
|
+
_format = format
|
1803
|
+
_str = str
|
1804
|
+
_tip = tip
|
1805
|
+
_ignore_write_string = ignore_write_string
|
1756
1806
|
end
|
1757
1807
|
_format, _str = _str, _format if _str.respond_to?(:xf_index) || !_format.respond_to?(:xf_index)
|
1758
1808
|
raise WriteXLSXInsufficientArgumentError if [_row, _col, _url].include?(nil)
|
@@ -1770,7 +1820,7 @@ module Writexlsx
|
|
1770
1820
|
_format ||= @default_url_format
|
1771
1821
|
|
1772
1822
|
# Write the hyperlink string.
|
1773
|
-
write_string(_row, _col, hyperlink.str, _format)
|
1823
|
+
write_string(_row, _col, hyperlink.str, _format) unless _ignore_write_string
|
1774
1824
|
end
|
1775
1825
|
|
1776
1826
|
#
|
@@ -1915,6 +1965,65 @@ module Writexlsx
|
|
1915
1965
|
]
|
1916
1966
|
end
|
1917
1967
|
|
1968
|
+
#
|
1969
|
+
# Embed an image into the worksheet.
|
1970
|
+
#
|
1971
|
+
def embed_image(row, col, filename, options = nil)
|
1972
|
+
# Check for a cell reference in A1 notation and substitute row and column.
|
1973
|
+
if (row_col_array = row_col_notation(row))
|
1974
|
+
_row, _col = row_col_array
|
1975
|
+
image = col
|
1976
|
+
_options = filename
|
1977
|
+
else
|
1978
|
+
_row = row
|
1979
|
+
_col = col
|
1980
|
+
image = filename
|
1981
|
+
_options = options
|
1982
|
+
end
|
1983
|
+
xf, url, tip, description, decorative = []
|
1984
|
+
|
1985
|
+
raise WriteXLSXInsufficientArgumentError if [_row, _col, image].include?(nil)
|
1986
|
+
raise "Couldn't locate #{image}" unless File.exist?(image)
|
1987
|
+
|
1988
|
+
# Check that row and col are valid and store max and min values
|
1989
|
+
check_dimensions(_row, _col)
|
1990
|
+
store_row_col_max_min_values(_row, _col)
|
1991
|
+
|
1992
|
+
if options
|
1993
|
+
xf = options[:cell_format]
|
1994
|
+
url = options[:url]
|
1995
|
+
tip = options[:tip]
|
1996
|
+
description = options[:description]
|
1997
|
+
decorative = options[:decorative]
|
1998
|
+
end
|
1999
|
+
|
2000
|
+
# Write the url without writing a string.
|
2001
|
+
if url
|
2002
|
+
xf ||= @default_url_format
|
2003
|
+
|
2004
|
+
write_url(row, col, url, xf, nil, tip, true)
|
2005
|
+
end
|
2006
|
+
|
2007
|
+
# Get the image properties, mainly for the type and checksum.
|
2008
|
+
image_properties = get_image_properties(image)
|
2009
|
+
type = image_properties[0]
|
2010
|
+
md5 = image_properties[6]
|
2011
|
+
|
2012
|
+
# Check for duplicate images.
|
2013
|
+
image_index = @embedded_image_indexes[md5]
|
2014
|
+
|
2015
|
+
unless ptrue?(image_index)
|
2016
|
+
@workbook.embedded_images << [image, type, description, decorative]
|
2017
|
+
|
2018
|
+
image_index = @workbook.embedded_images.size
|
2019
|
+
@embedded_image_indexes[md5] = image_index
|
2020
|
+
end
|
2021
|
+
|
2022
|
+
# Write the cell placeholder.
|
2023
|
+
store_data_to_table(EmbedImageCellData.new(image_index, xf), _row, _col)
|
2024
|
+
@has_embedded_images = true
|
2025
|
+
end
|
2026
|
+
|
1918
2027
|
#
|
1919
2028
|
# :call-seq:
|
1920
2029
|
# repeat_formula(row, column, formula [ , format ])
|
@@ -2755,8 +2864,12 @@ module Writexlsx
|
|
2755
2864
|
end
|
2756
2865
|
end
|
2757
2866
|
|
2758
|
-
def
|
2759
|
-
@
|
2867
|
+
def has_dynamic_functions?
|
2868
|
+
@has_dynamic_functions
|
2869
|
+
end
|
2870
|
+
|
2871
|
+
def has_embedded_images?
|
2872
|
+
@has_embedded_images
|
2760
2873
|
end
|
2761
2874
|
|
2762
2875
|
private
|
@@ -2926,7 +3039,7 @@ module Writexlsx
|
|
2926
3039
|
tokens.map! do |token|
|
2927
3040
|
token.sub!(/^"/, '')
|
2928
3041
|
token.sub!(/"$/, '')
|
2929
|
-
token.gsub!(
|
3042
|
+
token.gsub!('""', '"')
|
2930
3043
|
|
2931
3044
|
# if token is number, convert to numeric.
|
2932
3045
|
if token =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
|
@@ -3208,13 +3321,13 @@ module Writexlsx
|
|
3208
3321
|
target = escape_url(url.sub(/^external:/, ''))
|
3209
3322
|
|
3210
3323
|
# Additional escape not required in worksheet hyperlinks
|
3211
|
-
target = target.gsub(
|
3324
|
+
target = target.gsub("#", '%23')
|
3212
3325
|
|
3213
3326
|
# Prefix absolute paths (not relative) with file:///
|
3214
3327
|
target = if target =~ /^\w:/ || target =~ /^\\\\/
|
3215
3328
|
"file:///#{target}"
|
3216
3329
|
else
|
3217
|
-
target.gsub(
|
3330
|
+
target.gsub("\\", '/')
|
3218
3331
|
end
|
3219
3332
|
end
|
3220
3333
|
|
@@ -3234,6 +3347,7 @@ EOS
|
|
3234
3347
|
end
|
3235
3348
|
|
3236
3349
|
@drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"] unless @drawing_rels[md5]
|
3350
|
+
|
3237
3351
|
drawing.rel_index = drawing_rel_index(md5)
|
3238
3352
|
end
|
3239
3353
|
public :prepare_image
|
@@ -3437,7 +3551,7 @@ EOS
|
|
3437
3551
|
def encode_password(password) # :nodoc:
|
3438
3552
|
hash = 0
|
3439
3553
|
|
3440
|
-
password.reverse.split(
|
3554
|
+
password.reverse.split("").each do |char|
|
3441
3555
|
hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff)
|
3442
3556
|
hash ^= char.ord
|
3443
3557
|
end
|
@@ -3559,16 +3673,27 @@ EOS
|
|
3559
3673
|
attributes << ["showOutlineSymbols", 0] if @outline_on
|
3560
3674
|
|
3561
3675
|
# Set the page view/layout mode if required.
|
3562
|
-
|
3563
|
-
|
3676
|
+
case @page_view
|
3677
|
+
when 1
|
3678
|
+
attributes << %w[view pageLayout]
|
3679
|
+
when 2
|
3680
|
+
attributes << %w[view pageBreakPreview]
|
3681
|
+
end
|
3564
3682
|
|
3565
3683
|
# Set the first visible cell.
|
3566
3684
|
attributes << ['topLeftCell', @top_left_cell] if ptrue?(@top_left_cell)
|
3567
3685
|
|
3568
3686
|
# Set the zoom level.
|
3569
3687
|
if @zoom != 100
|
3570
|
-
attributes << ['zoomScale', @zoom]
|
3571
|
-
|
3688
|
+
attributes << ['zoomScale', @zoom]
|
3689
|
+
|
3690
|
+
if @page_view == 1
|
3691
|
+
attributes << ['zoomScalePageLayoutView', @zoom]
|
3692
|
+
elsif @page_view == 2
|
3693
|
+
attributes << ['zoomScaleSheetLayoutView', @zoom]
|
3694
|
+
elsif ptrue?(@zoom_scale_normal)
|
3695
|
+
attributes << ['zoomScaleNormal', @zoom]
|
3696
|
+
end
|
3572
3697
|
end
|
3573
3698
|
|
3574
3699
|
attributes << ['workbookViewId', 0]
|
@@ -3754,9 +3879,10 @@ EOS
|
|
3754
3879
|
|
3755
3880
|
def write_cell_column_dimension(row_num) # :nodoc:
|
3756
3881
|
row = @cell_data_table[row_num]
|
3882
|
+
row_name = (row_num + 1).to_s
|
3757
3883
|
(@dim_colmin..@dim_colmax).each do |col_num|
|
3758
3884
|
if (cell = row[col_num])
|
3759
|
-
cell.write_cell(self, row_num, col_num)
|
3885
|
+
cell.write_cell(self, row_num, row_name, col_num)
|
3760
3886
|
end
|
3761
3887
|
end
|
3762
3888
|
end
|
@@ -4200,9 +4326,10 @@ EOS
|
|
4200
4326
|
|
4201
4327
|
# If the cell isn't a string then we have to add the url as
|
4202
4328
|
# the string to display
|
4203
|
-
if ptrue?(@cell_data_table)
|
4204
|
-
ptrue?(@cell_data_table[row_num])
|
4205
|
-
ptrue?(@cell_data_table[row_num][col_num]) &&
|
4329
|
+
if ptrue?(@cell_data_table) &&
|
4330
|
+
ptrue?(@cell_data_table[row_num]) &&
|
4331
|
+
ptrue?(@cell_data_table[row_num][col_num]) &&
|
4332
|
+
@cell_data_table[row_num][col_num].display_url_string?
|
4206
4333
|
link.display_on
|
4207
4334
|
end
|
4208
4335
|
|
@@ -4755,10 +4882,6 @@ EOS
|
|
4755
4882
|
ptrue?(@zoom_scale_normal)
|
4756
4883
|
end
|
4757
4884
|
|
4758
|
-
def page_view? # :nodoc:
|
4759
|
-
!!@page_view
|
4760
|
-
end
|
4761
|
-
|
4762
4885
|
def right_to_left? # :nodoc:
|
4763
4886
|
!!@right_to_left
|
4764
4887
|
end
|
data/write_xlsx.gemspec
CHANGED
@@ -20,9 +20,11 @@ Gem::Specification.new do |gem|
|
|
20
20
|
end
|
21
21
|
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
22
22
|
gem.require_paths = ['lib']
|
23
|
+
gem.add_runtime_dependency 'nkf'
|
23
24
|
gem.add_runtime_dependency 'rubyzip', '>= 1.0.0'
|
24
25
|
gem.add_development_dependency 'byebug'
|
25
26
|
gem.add_development_dependency 'minitest'
|
27
|
+
gem.add_development_dependency 'mutex_m'
|
26
28
|
gem.add_development_dependency 'rake'
|
27
29
|
gem.add_development_dependency 'rubocop'
|
28
30
|
gem.add_development_dependency 'rubocop-minitest'
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: write_xlsx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hideo NAKAMURA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nkf
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rubyzip
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mutex_m
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,6 +266,10 @@ files:
|
|
238
266
|
- lib/write_xlsx/package/metadata.rb
|
239
267
|
- lib/write_xlsx/package/packager.rb
|
240
268
|
- lib/write_xlsx/package/relationships.rb
|
269
|
+
- lib/write_xlsx/package/rich_value.rb
|
270
|
+
- lib/write_xlsx/package/rich_value_rel.rb
|
271
|
+
- lib/write_xlsx/package/rich_value_structure.rb
|
272
|
+
- lib/write_xlsx/package/rich_value_types.rb
|
241
273
|
- lib/write_xlsx/package/shared_strings.rb
|
242
274
|
- lib/write_xlsx/package/styles.rb
|
243
275
|
- lib/write_xlsx/package/table.rb
|
@@ -276,7 +308,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
276
308
|
- !ruby/object:Gem::Version
|
277
309
|
version: '0'
|
278
310
|
requirements: []
|
279
|
-
rubygems_version: 3.4.
|
311
|
+
rubygems_version: 3.4.19
|
280
312
|
signing_key:
|
281
313
|
specification_version: 4
|
282
314
|
summary: write_xlsx is a gem to create a new file in the Excel 2007+ XLSX format.
|