diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index c2525f1471115fe3c4cc28b8179469d6d3c7a83b..03704704b080c47146c15f629ba6b1e2ed7c0bb2 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -30,10 +30,12 @@ module Excelsior
 
       @report = Report.new
 
-      valid?
+      validate!
     end
 
     def run(&block)
+      return unless valid?
+
       if self.class.use_transaction
         model_class.transaction do
           insert_rows(&block)
@@ -45,7 +47,7 @@ module Excelsior
       end
     end
 
-    def valid?
+    def validate!
       @errors = fields.to_a.each_with_object({}) do |f, acc|
         acc[:missing_column] ||= []
 
@@ -53,6 +55,10 @@ module Excelsior
       end
     end
 
+    def valid?
+      @errors[:missing_column].empty?
+    end
+
     private
 
     def model_class
@@ -60,6 +66,8 @@ module Excelsior
     end
 
     def add_model_errors(record, index)
+      @errors[:model] ||= []
+
       if record.errors.empty?
         report_insert
         return
@@ -67,8 +75,6 @@ module Excelsior
 
       report_failure
 
-      @errors[:model] ||= []
-
       @errors[:model] << Error.new(index + 1, record.errors.full_messages)
     end
 
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index 2d97bb39f85222a089a73e982c06a53bc59a950c..b8d2ed5ab38ceb8737da414a028e61882657a4f6 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -156,6 +156,12 @@ describe Excelsior do
       assert import.errors[:missing_column].any?
     end
 
+    it 'does not run the import' do
+      import = UserImport.new('test/files/missing-column.xlsx')
+      import.run
+      assert_equal 0, import.report.total
+    end
+
     it 'returns the model validation errors' do
       import = UserImport.new('test/files/missing-first-name.xlsx').tap(&:run)
       assert import.errors[:model].any?