diff --git a/components/date.inc b/components/date.inc
index bf7f6e1..f8e18d1 100644
--- a/components/date.inc
+++ b/components/date.inc
@@ -392,6 +392,14 @@ function _webform_analysis_date($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_date($component, $sids = array()) {
+  $rows = webform_component_invoke('date', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_date($component, $value) {
diff --git a/components/email.inc b/components/email.inc
index 156ae74..dfbd043 100644
--- a/components/email.inc
+++ b/components/email.inc
@@ -256,6 +256,15 @@ function _webform_analysis_email($component, $sids = array()) {
   return $rows;
 }
 
+
+/**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_email($component, $sids = array()) {
+  $rows = webform_component_invoke('email', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
 /**
  * Implements _webform_table_component().
  */
diff --git a/components/file.inc b/components/file.inc
index c68e1f8..3a5970c 100644
--- a/components/file.inc
+++ b/components/file.inc
@@ -472,6 +472,14 @@ function _webform_analysis_file($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_file($component, $sids = array()) {
+  $rows = webform_component_invoke('file', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_file($component, $value) {
diff --git a/components/grid.inc b/components/grid.inc
index 9be01ea..32a6dba 100644
--- a/components/grid.inc
+++ b/components/grid.inc
@@ -337,6 +337,59 @@ function _webform_analysis_grid($component, $sids = array()) {
   return array(array(array('data' => $output, 'colspan' => 2)));
 }
 
+
+/**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_grid($component, $sids = array()) {
+  // Generate the list of options and questions.
+  $options = _webform_select_options_from_text($component['extra']['options'], TRUE);
+  $questions = _webform_select_options_from_text($component['extra']['questions'], TRUE);
+  $cid = $component['cid'];
+  $form_key = $component['form_key'];
+  $parent_question = $component['name'];
+  // Generate a lookup table of results.
+  $query = db_select('webform_submitted_data', 'wsd')
+    ->fields('wsd', array('no', 'data'))
+    ->condition('nid', $component['nid'])
+    ->condition('cid', $component['cid'])
+    ->condition('data', '', '<>')
+    ->groupBy('no')
+    ->groupBy('data');
+  $query->addExpression('COUNT(sid)', 'datacount');
+
+  if (count($sids)) {
+    $query->condition('sid', $sids, 'IN');
+  }
+
+  $result = $query->execute();
+  $counts = array();
+  foreach ($result as $data) {
+    $counts[$data->no][$data->data] = $data->datacount;
+  }
+
+  // Create an entire table to be put into the returned row.
+  $rows = array();
+  $answer_set = array();
+  $question_set = array();
+  // Add questions as each row.
+  foreach ($questions as $qkey => $question) {
+    $answers = array();
+    $question_set[$cid.'_'.$qkey] = $component;
+    $question_set[$cid.'_'.$qkey]['name'] = $question;
+    $question_set[$cid.'_'.$qkey]['type'] = 'grid_component';
+    $question_set[$cid.'_'.$qkey]['form_key'] = $form_key.'_'.$qkey;
+    $question_set[$cid.'_'.$qkey]['parent_question'] = $parent_question;
+    foreach ($options as $okey => $option) {
+      $answers[] = array(_webform_filter_xss($option), !empty($counts[$qkey][$okey]) ? $counts[$qkey][$okey] : 0);
+    }
+    $answer_set[$cid.'_'.$qkey] = $answers;
+  }
+
+  return array('question_set' => $question_set, 'answer_set' => $answer_set);
+}
+
+
 /**
  * Implements _webform_table_component().
  */
diff --git a/components/hidden.inc b/components/hidden.inc
index 96be471..4f13907 100644
--- a/components/hidden.inc
+++ b/components/hidden.inc
@@ -161,6 +161,14 @@ function _webform_analysis_hidden($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_hidden($component, $sids = array()) {
+  $rows = webform_component_invoke('hidden', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_csv_data_component().
  */
 function _webform_table_hidden($component, $value) {
diff --git a/components/number.inc b/components/number.inc
index e90eb0a..40ca5c6 100644
--- a/components/number.inc
+++ b/components/number.inc
@@ -489,6 +489,14 @@ function _webform_analysis_number($component, $sids = array(), $single = FALSE)
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_number($component, $sids = array(), $single = FALSE) {
+  $rows = webform_component_invoke('number', 'analysis', $component, $sids, $single);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_number($component, $value) {
diff --git a/components/select.inc b/components/select.inc
index 32f982e..f01075a 100644
--- a/components/select.inc
+++ b/components/select.inc
@@ -631,6 +631,14 @@ function _webform_analysis_select($component, $sids = array(), $single = FALSE)
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_select($component, $sids = array(), $single = FALSE) {
+  $rows = webform_component_invoke('select', 'analysis', $component, $sids, $single);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_select($component, $value) {
diff --git a/components/textarea.inc b/components/textarea.inc
index d394e78..090a2f4 100644
--- a/components/textarea.inc
+++ b/components/textarea.inc
@@ -190,6 +190,14 @@ function _webform_analysis_textarea($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_textarea($component, $sids = array()) {
+  $rows = webform_component_invoke('textarea', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_textarea($component, $value) {
diff --git a/components/textfield.inc b/components/textfield.inc
index 3a3d981..adfec3d 100644
--- a/components/textfield.inc
+++ b/components/textfield.inc
@@ -227,6 +227,14 @@ function _webform_analysis_textfield($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_textfield($component, $sids = array()) {
+  $rows = webform_component_invoke('textfield', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_textfield($component, $value) {
diff --git a/components/time.inc b/components/time.inc
index 8fba13b..234c3e9 100644
--- a/components/time.inc
+++ b/components/time.inc
@@ -299,6 +299,14 @@ function _webform_analysis_time($component, $sids = array()) {
 }
 
 /**
+ * Implements _webform_analysis_data_component().
+ */
+function _webform_analysis_data_time($component, $sids = array()) {
+  $rows = webform_component_invoke('time', 'analysis', $component, $sids);
+  return array('question_set' => array($component['cid'] => $component), 'answer_set' => array($component['cid'] => $rows));
+}
+
+/**
  * Implements _webform_table_component().
  */
 function _webform_table_time($component, $value) {
