diff --git a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs
index ee35dcf..bc17ff0 100644
--- a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs
+++ b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs
@@ -307,5 +307,24 @@ namespace Spectre.Console.Tests.Unit.Composition
             console.Lines[5].ShouldBe("│ Grault │ Garply │   Fred   │");
             console.Lines[6].ShouldBe("└────────┴────────┴──────────┘");
         }
+
+        [Fact]
+        public void Should_Render_Table_Without_Footer_If_No_Rows_Are_Added()
+        {
+            // Given
+            var console = new PlainConsole(width: 80);
+            var table = new Table();
+            table.AddColumns("Foo", "Bar");
+            table.AddColumn(new TableColumn("Baz") { Padding = new Padding(3, 2) });
+
+            // When
+            console.Render(table);
+
+            // Then
+            console.Lines.Count.ShouldBe(3);
+            console.Lines[0].ShouldBe("┌─────┬─────┬────────┐");
+            console.Lines[1].ShouldBe("│ Foo │ Bar │   Baz  │");
+            console.Lines[2].ShouldBe("└─────┴─────┴────────┘");
+        }
     }
 }
diff --git a/src/Spectre.Console/Composition/Table.Calculations.cs b/src/Spectre.Console/Composition/Table.Calculations.cs
index 8316cb3..98e36d0 100644
--- a/src/Spectre.Console/Composition/Table.Calculations.cs
+++ b/src/Spectre.Console/Composition/Table.Calculations.cs
@@ -61,7 +61,7 @@ namespace Spectre.Console
                         .Where(x => x.allowWrap)
                         .Max(x => x.width);
 
-                    var secondMaxColumn = widths.Zip(wrappable, (width, allowWrap) => allowWrap && width != maxColumn ? width : 0).Max();
+                    var secondMaxColumn = widths.Zip(wrappable, (width, allowWrap) => allowWrap && width != maxColumn ? width : 1).Max();
                     var columnDifference = maxColumn - secondMaxColumn;
 
                     var ratios = widths.Zip(wrappable, (width, allowWrap) => width == maxColumn && allowWrap ? 1 : 0).ToList();
@@ -96,9 +96,15 @@ namespace Spectre.Console
 
             var minWidths = new List<int>();
             var maxWidths = new List<int>();
+
+            // Include columns in measurement
+            var measure = ((IRenderable)column.Text).Measure(options, maxWidth);
+            minWidths.Add(measure.Min);
+            maxWidths.Add(measure.Max);
+
             foreach (var row in rows)
             {
-                var measure = ((IRenderable)row).Measure(options, maxWidth);
+                measure = ((IRenderable)row).Measure(options, maxWidth);
                 minWidths.Add(measure.Min);
                 maxWidths.Add(measure.Max);
             }
diff --git a/src/Spectre.Console/Composition/Table.cs b/src/Spectre.Console/Composition/Table.cs
index d0e3c42..17ce99c 100644
--- a/src/Spectre.Console/Composition/Table.cs
+++ b/src/Spectre.Console/Composition/Table.cs
@@ -178,6 +178,7 @@ namespace Spectre.Console
 
             var showBorder = Border != BorderKind.None;
             var hideBorder = Border == BorderKind.None;
+            var hasRows = _rows.Count > 0;
 
             var maxWidth = width;
             if (Width != null)
@@ -303,7 +304,7 @@ namespace Spectre.Console
                 }
 
                 // Show header separator?
-                if (firstRow && showBorder && ShowHeaders)
+                if (firstRow && showBorder && ShowHeaders && hasRows)
                 {
                     result.Add(new Segment(border.GetPart(BorderPart.HeaderBottomLeft)));
                     foreach (var (columnIndex, first, lastColumn, columnWidth) in columnWidths.Enumerate())
diff --git a/src/Spectre.Console/Composition/Text.cs b/src/Spectre.Console/Composition/Text.cs
index 4978206..d7de7dd 100644
--- a/src/Spectre.Console/Composition/Text.cs
+++ b/src/Spectre.Console/Composition/Text.cs
@@ -141,6 +141,11 @@ namespace Spectre.Console
                 return Array.Empty<Segment>();
             }
 
+            if (width == 0)
+            {
+                return Array.Empty<Segment>();
+            }
+
             var result = new List<Segment>();
             var segments = SplitLineBreaks(CreateSegments());