diff --git a/webform_report.inc b/webform_report.inc
index bcc4901..b9283f5 100644
--- a/webform_report.inc
+++ b/webform_report.inc
@@ -87,6 +87,66 @@ function _webform_report_get_columns($node, $components) {
 }
 
 /**
+ * return an associative array containing every component in a webform as a
+ * column, as well as the added webform report meta fields.
+ *
+ * @param node
+ *   the webform report node
+ * @param components
+ *   array of webform components
+ * @return
+ *   an associative array of webform report columns
+ */
+function _webform_report_get_all_columns($node, $components) {
+
+  // get format and options for columns included in webform report
+  $report_columns = array();
+  foreach ($node->columns as $column) {
+    $report_columns[$column['cid']] = array(
+      'format' => $column['format'],
+      'option' => $column['option'],
+      'hidden' => $column['hidden'],
+    );
+  }
+
+  $all_columns = array();
+  foreach ($components as $cid => $component) {
+
+    // exclude webform pagebreaks, markup fields and view/edit/delete links
+    if ($component['type'] != 'pagebreak' && $component['type'] != 'markup' && $cid > -5) {
+
+      // default formatting so dates don't get mangled
+      switch ($component['type']) {
+        case 'date':
+          $format = 'Y/m/d';
+          break;
+        case 'time':
+          $format = 'H:m';
+          break;
+        default:
+          $format = 'VALUE';
+      }
+
+      // allow the report to override default format
+      if (isset($report_columns[$cid]['format'])) {
+        $format = $report_columns[$cid]['format'];
+      }
+
+      $all_columns[] = array(
+        'name' => $component['name'],
+        'type' => $component['type'],
+        'format' => $format,
+        'option' => isset($report_columns[$cid]['option']) ? $report_columns[$cid]['option'] : '',
+        'cid' => $cid,
+        'hidden' => isset($report_columns[$cid]['hidden']) ? $report_columns[$cid]['hidden'] : FALSE,
+      );
+    }
+  }
+
+  return $all_columns;
+}
+
+/**
  * return an associative array containing the webform report filters
  *
  * @param node
@@ -319,13 +379,17 @@ function _webform_report_get_body_content($node, $teaser=FALSE, $page=FALSE) {
  * @return 
  *   report array - keys 'headers' = report headers, 'rows' = report rows
  */
-function _webform_report_get_report_data($node) {
+function _webform_report_get_report_data($node, $all_columns = FALSE) {
 
   $report = array();
   
   // get report criteria
   $components = _webform_report_get_components($node->wnid);
-  $columns = _webform_report_get_columns($node, $components);
+  if ($all_columns) {
+    $columns = _webform_report_get_all_columns($node, $components);
+  } else {
+    $columns = _webform_report_get_columns($node, $components);
+  }
     
   // if any columns
   if (count($columns) > 0) {
@@ -1334,6 +1398,13 @@ function webform_report_csv($node) {
     '#default_value' => 'text',
   );
 
+  $form['export']['export_all'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Include all webform components'),
+    '#default_value' => FALSE,
+    '#description' => t('Checking this option will include all components from the webform in the export, except the columns specified as hidden in the report.'),
+  );
+
   $delim = array(
     ','  => t('Comma (,)'),
     '\t' => t('Tab (\t)'),
@@ -1378,10 +1449,11 @@ function webform_report_export_form_submit($form_id, $form_state) {
   $nid = $form_state['values']['nid'];
   $format = $form_state['values']['format'];
   $delim = $form_state['values']['delim'];
+  $export_all = $form_state['values']['export_all'];
   
   $node = node_load($nid);
 
-  $report = _webform_report_get_report_data($node);
+  $report = _webform_report_get_report_data($node, $export_all);
   
   if (isset($report['headers']) && isset($report['rows'])) {
       
