Repository: jmcnamara/XlsxWriter

Issue:
Feature Request: Add minLength and maxLength to dataBar attributes
Attributes minLength and maxLength determine maximum and minimum histogram length in percentage of cell width. Currently those attributes are not set. Default values are 10 and 90 percent. It would be useful to have possibility of setting them manually.

I've already implemented that. If you're OK I would create a merge request.

Discussion:

Patch:
diff --git a/xlsxwriter/worksheet.py b/xlsxwriter/worksheet.py
index 3e63ea53..dbe8e63e 100644
--- a/xlsxwriter/worksheet.py
+++ b/xlsxwriter/worksheet.py
@@ -1880,6 +1880,8 @@ class Worksheet(xmlwriter.XMLwriter):
             'min_color': True,
             'mid_color': True,
             'max_color': True,
+            'min_length': True,
+            'max_length': True,
             'multi_range': True,
             'bar_color': 1}
 
@@ -6026,7 +6028,15 @@ class Worksheet(xmlwriter.XMLwriter):
 
     def _write_data_bar(self, param):
         # Write the <dataBar> element.
-        self._xml_start_tag('dataBar')
+        attributes = []
+
+        if 'min_length' in param:
+            attributes.append(('minLength', param['min_length']))
+
+        if 'max_length' in param:
+            attributes.append(('maxLength', param['max_length']))
+
+        self._xml_start_tag('dataBar', attributes)
 
         self._write_cfvo(param['min_type'], param['min_value'])
         self._write_cfvo(param['max_type'], param['max_value'])


Test patch:
diff --git a/xlsxwriter/test/worksheet/test_cond_format21.py b/xlsxwriter/test/worksheet/test_cond_format21.py
new file mode 100644
index 00000000..4428b18e
--- /dev/null
+++ b/xlsxwriter/test/worksheet/test_cond_format21.py
@@ -0,0 +1,141 @@
+###############################################################################
+#
+# Tests for XlsxWriter.
+#
+# Copyright (c), 2013-2016, John McNamara, jmcnamara@cpan.org
+#
+
+import unittest
+from ...compatibility import StringIO
+from ..helperfunctions import _xml_to_list
+from ...worksheet import Worksheet
+
+
+class TestAssembleWorksheet(unittest.TestCase):
+    """
+    Test assembling a complete Worksheet file.
+
+    """
+    def test_assemble_xml_file(self):
+        """Test writing a worksheet with conditional formatting."""
+        self.maxDiff = None
+
+        fh = StringIO()
+        worksheet = Worksheet()
+        worksheet._set_filehandle(fh)
+        worksheet.select()
+
+        worksheet.write('A1', 1)
+        worksheet.write('A2', 2)
+        worksheet.write('A3', 3)
+        worksheet.write('A4', 4)
+        worksheet.write('A5', 5)
+        worksheet.write('A6', 6)
+        worksheet.write('A7', 7)
+        worksheet.write('A8', 8)
+        worksheet.write('A9', 9)
+        worksheet.write('A10', 10)
+        worksheet.write('A11', 11)
+        worksheet.write('A12', 12)
+
+        worksheet.conditional_format('A1:A12',
+                                     {'type': 'data_bar',
+                                      'min_value': 5,
+                                      'mid_value': 52,  # Should be ignored.
+                                      'max_value': 90,
+                                      'min_length': 5,
+                                      'max_length': 95,
+                                      'min_type': 'num',
+                                      'mid_type': 'percentile',  # Should be ignored.
+                                      'max_type': 'percent',
+                                      'bar_color': '#8DB4E3',
+                                      })
+
+        worksheet._assemble_xml_file()
+
+        exp = _xml_to_list("""
+                <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+                <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
+                  <dimension ref="A1:A12"/>
+                  <sheetViews>
+                    <sheetView tabSelected="1" workbookViewId="0"/>
+                  </sheetViews>
+                  <sheetFormatPr defaultRowHeight="15"/>
+                  <sheetData>
+                    <row r="1" spans="1:1">
+                      <c r="A1">
+                        <v>1</v>
+                      </c>
+                    </row>
+                    <row r="2" spans="1:1">
+                      <c r="A2">
+                        <v>2</v>
+                      </c>
+                    </row>
+                    <row r="3" spans="1:1">
+                      <c r="A3">
+                        <v>3</v>
+                      </c>
+                    </row>
+                    <row r="4" spans="1:1">
+                      <c r="A4">
+                        <v>4</v>
+                      </c>
+                    </row>
+                    <row r="5" spans="1:1">
+                      <c r="A5">
+                        <v>5</v>
+                      </c>
+                    </row>
+                    <row r="6" spans="1:1">
+                      <c r="A6">
+                        <v>6</v>
+                      </c>
+                    </row>
+                    <row r="7" spans="1:1">
+                      <c r="A7">
+                        <v>7</v>
+                      </c>
+                    </row>
+                    <row r="8" spans="1:1">
+                      <c r="A8">
+                        <v>8</v>
+                      </c>
+                    </row>
+                    <row r="9" spans="1:1">
+                      <c r="A9">
+                        <v>9</v>
+                      </c>
+                    </row>
+                    <row r="10" spans="1:1">
+                      <c r="A10">
+                        <v>10</v>
+                      </c>
+                    </row>
+                    <row r="11" spans="1:1">
+                      <c r="A11">
+                        <v>11</v>
+                      </c>
+                    </row>
+                    <row r="12" spans="1:1">
+                      <c r="A12">
+                        <v>12</v>
+                      </c>
+                    </row>
+                  </sheetData>
+                  <conditionalFormatting sqref="A1:A12">
+                    <cfRule type="dataBar" priority="1">
+                      <dataBar minLength="5" maxLength="95">
+                        <cfvo type="num" val="5"/>
+                        <cfvo type="percent" val="90"/>
+                        <color rgb="FF8DB4E3"/>
+                      </dataBar>
+                    </cfRule>
+                  </conditionalFormatting>
+                  <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
+                </worksheet>
+                """)
+
+        got = _xml_to_list(fh.getvalue())
+
+        self.assertEqual(got, exp)