write_xlsx 1.11.1 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|