From fb70bc1850d0d5651c97c7e71d297a7f9f5a9919 Mon Sep 17 00:00:00 2001
From: Dan Chadwick <dan899@gmail.com>
Date: Fri, 27 Feb 2015 16:50:16 -0500
Subject: [PATCH] Issue #2420249 by DanChadwick: Added option to force Excel
 wordwrap.

---
 includes/exporters/webform_exporter.inc            |   25 ++++++++++++++++++++
 includes/exporters/webform_exporter_excel_xlsx.inc |    2 +-
 includes/webform.admin.inc                         |   11 ++++++++
 webform.install                                    |    1 +
 webform.module                                     |    3 ++
 5 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/includes/exporters/webform_exporter.inc b/includes/exporters/webform_exporter.inc
index 670600e..3de1396 100644
--- a/includes/exporters/webform_exporter.inc
+++ b/includes/exporters/webform_exporter.inc
@@ -4,6 +4,7 @@
  */
 class webform_exporter {
   public $options = array();
+  public $export_wordrap;
 
   /**
    * Constructor for webform_exporter classes.
@@ -13,6 +14,30 @@ class webform_exporter {
    */
   function __construct($options) {
     $this->options = $options;
+    $this->export_wordwrap = webform_variable_get('webform_export_wordwrap');
+  }
+
+  /**
+   * Determines whether a cell is eligible for word-wrapping based upon
+   * position in file and the contents of cell.
+   *
+   * Return true when the global word-wrapping option is enabled and the cell
+   * is anything other than the first column in either of the first two rows.
+   * By default, these rows are long and are intended to overlap the columns
+   * to the right. Also returns true when the cell contains a return character.
+   *
+   * @param int $row
+   *   Row number, counting from 0.
+   * @param int $column
+   *   Column number, counting from 0.
+   * @param string $value
+   *   The value of the cell.
+   * @return boolean
+   *   Whether the cell position is elegible for wordwrapping.
+   */
+  function wrappable($row, $column, $value) {
+    return strpos($value, "\n") !== FALSE ||
+           $this->export_wordwrap && ($row > 2 || $column > 0 || $this->options['header_keys'] < 0);
   }
 
   /**
diff --git a/includes/exporters/webform_exporter_excel_xlsx.inc b/includes/exporters/webform_exporter_excel_xlsx.inc
index 4379a82..836c985 100644
--- a/includes/exporters/webform_exporter_excel_xlsx.inc
+++ b/includes/exporters/webform_exporter_excel_xlsx.inc
@@ -82,7 +82,7 @@ class webform_exporter_excel_xlsx extends webform_exporter {
         }
       }
       else {
-        $output .= '<c r="' . $cell_position . '" t="inlineStr"' . (strpos($value, "\n") === FALSE ? '' : ' s="4"') . '><is><t>';
+        $output .= '<c r="' . $cell_position . '" t="inlineStr"' . ($this->wrappable($row_count, $key, $value) ? ' s="4"' : '') . '><is><t>';
         $output .= htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
         $output .= '</t></is></c>';
       }
diff --git a/includes/webform.admin.inc b/includes/webform.admin.inc
index 928ea53..1ccb592 100644
--- a/includes/webform.admin.inc
+++ b/includes/webform.admin.inc
@@ -201,6 +201,17 @@ function webform_admin_settings() {
     ),
   );
 
+  $form['advanced']['webform_export_wordwrap'] = array(
+    '#type' => 'radios',
+    '#title' => t('Export word-wrap'),
+    '#options' => array(
+      '0' => t('Only text containing return characters'),
+      '1' => t('All text'),
+    ),
+    '#default_value' => webform_variable_get('webform_export_wordwrap'),
+    '#description' => t('Some export formats, such as Microsoft Excel, support word-wrapped text cells.'),
+  );
+
   $form['advanced']['webform_submission_access_control']  = array(
     '#type' => 'radios',
     '#title' => t('Submission access control'),
diff --git a/webform.install b/webform.install
index 428fbda..4da1100 100644
--- a/webform.install
+++ b/webform.install
@@ -689,6 +689,7 @@ function webform_uninstall() {
   variable_del('webform_node_types_primary');
   variable_del('webform_export_format');
   variable_del('webform_csv_delimiter');
+  variable_del('webform_export_wordwrap');
   variable_del('webform_excel_legacy_exporter');
   variable_del('webform_progressbar_style');
   variable_del('webform_progressbar_label_first');
diff --git a/webform.module b/webform.module
index ea88f64..a70b98e 100644
--- a/webform.module
+++ b/webform.module
@@ -4081,6 +4081,9 @@ function webform_variable_get($variable) {
     case 'webform_csv_delimiter':
       $result = variable_get('webform_csv_delimiter', '\t');
       break;
+    case 'webform_export_wordwrap':
+      $result = variable_get('webform_export_wordwrap', 0);
+      break;
     case 'webform_excel_legacy_exporter':
       $result = variable_get('webform_excel_legacy_exporter', 0);
       break;
-- 
1.7.8.msysgit.0

