Statistical Tables in WordPress: Block, Plugin or HTML?

The core Table block is enough for a short table that never changes. Once the numbers need sorting, calculated totals or a spreadsheet import, you want a table plugin such as wpDataTables.

The block’s documentation lists a header section, a footer section, stripes, captions and column alignment. Sorting, search and merged cells aren’t on it.

How many rows you have matters about as much as which features you need. The wpDataTables documentation says standard tables slow down above roughly 2,000 to 3,000 rows. Past that, you’re looking at server-side loading, a summary table or a chart instead of dumping every row on the page.

Block, plugin or HTML: which method fits a statistical table?

The Table block suits a short table that never changes. A plugin makes sense when the data updates, needs sorting or needs calculated columns. Raw HTML is for the cases where you need markup the other two won’t produce.

Method Interactive features Data source Maintenance
Table block None documented Typed or pasted cells Edit inside each post
Table plugin Sorting, search, pagination CSV, Excel, JSON, Google Sheets, SQL (varies by plugin and license) Edit once, embed by block or shortcode
Custom HTML block Only what you script yourself Typed markup Edit the markup in each post

Merged cells are the gap that hurts most. Cross-tabulations usually want one header cell spanning several columns, and the core block can’t do that. Flexible Table Block, a plugin, adds merge and split controls to the editor.

The Table block is fine when the table is short, typed once and never recalculated. A plugin earns its place when the numbers come from a file or sheet, change over time, or need sorting for readers. Custom HTML? Only if you want exact control over the markup and accept editing it by hand.

If you’d rather skip plugins and keep the page light, the walkthrough on building a table in WordPress without a plugin covers the block and the HTML route.

Plain HTML tables give you the most control over the markup. The price is that every edit happens in the code, and sorting means writing your own JavaScript.

For statistical data I’d go with a plugin in most cases. If you’ll update a table more than once, hand-editing it gets old fast.

How to create a statistical table with the Table block

WordPress block editor with a Table block selected and the Settings panel showing fixed width cells, header section and footer section

Statistics go in columns and groups go in rows. Right-align anything numeric, and add a caption with the sample size and the data source.

  1. Type /table in the editor or pick Table from the block inserter, enter the column and row counts and click Create Table.
  2. In the Settings panel, switch on the header section. The footer section sits in the same panel and suits a totals or overall row.
  3. Fill in the cells. You can type the values, or paste a range copied from Excel or Google Sheets and WordPress builds the table from it. Scan the decimals afterwards.
  4. Select a cell in each number column and use Change column alignment in the block toolbar to right-align it. The label column stays left-aligned.
  5. The Add or remove caption button is where the table title, n and source go. Captions take bold, italic and links.
  6. Check the column widths. Fixed width cells have been on by default since WordPress 6.6, so every column gets equal width. Obviously the label column needs more room than the numbers, so turn the setting off if it does.

The Styles panel offers Default and Stripes. Stripes help readers follow a long row across five or six numeric columns.

Nothing in the block documentation says it calculates values. Cells hold typed text, so a changed input means retyping the total.

The footer section is the right place for that total (and if you plan to hand-code the table later, here’s how a table footer works in HTML).

Which table plugin handles statistical data best?

TablePress covers most statistical tables. It’s free and imports spreadsheets, and the base plugin already sorts and filters. wpDataTables is the better pick when the numbers sit in a database or need calculated columns.

Heavier doesn’t mean better. Does a table fed from a spreadsheet and updated monthly really need a database layer? Usually not. For a simple monthly table, TablePress or the free wpDataTables Lite both do the job. wpDataTables pulls ahead once the data lives in a database or the table needs calculated values, conditional formatting or a chart built from the same rows.

Northern Arizona University’s web user guide points editors to TablePress and notes that each table gets an ID code that goes into the page.

wpDataTables

wpDataTables

wpDataTables is built around data sources and column types, which is what separates it from a plain table editor. It lists 60,000+ active installations on WordPress.org, and the free Lite version already ships responsive tables and a table builder, plus imports from Excel, CSV, XML, JSON and serialized PHP arrays.

For statistics, the column types matter most. Each column is set as integer, float, string, date, datetime, time, currency or percentage, so numbers sort as numbers and dates sort as dates. A float column takes one decimal-places setting, which keeps a column of means or rates at the same precision.

Summary figures come from the table itself. Calculation functions add a sum, average, minimum or maximum for a numeric column as a totals row, and formula columns compute new values from existing ones, such as a rate per 1,000 people or the change between two years.

Reading the numbers gets easier with a few table features.

  • Conditional formatting colors cells, rows or columns by value, for example red below a threshold and green above it
  • Advanced filtering adds per-column filters such as number range, date range, select box and checkbox
  • Row grouping collects rows under a shared value, such as region or year
  • Table tools let visitors export the rows to CSV, Excel or PDF, copy them or print the table

Larger datasets are where the plugin pulls further ahead. Tables can read MySQL queries and external MS SQL or PostgreSQL databases, and server-side processing loads a big table page by page instead of all at once.

The same table can also feed a chart through the chart wizard, using Google Charts, Chart.js, Highcharts or ApexCharts, so a results table and its chart never drift apart. Tables are built with WCAG compatibility in mind too, with contrast improvements and screen reader support.

For a finished example, the statistics table example in the documentation shows a responsive statistics table with charts built from it.

Pros Cons
Responsive tables and file imports in Lite Google Sheets API and MySQL sources need Premium
Column types, totals rows and formula columns built for numeric data Calculating tools and server-side processing are Premium features
Conditional formatting, per-column filters and charts from one table Sticky headers and conditional highlighting are Premium
Server-side processing loads large tables page by page More settings to learn than a basic table plugin

TablePress

TablePress Import Tables screen with file upload, URL and manual input sources and the add, replace or append options

TablePress lists 600,000+ active installations on WordPress.org (version 3.4.1, October 2026).

The free version imports Excel, CSV, HTML, JSON and Google Sheets URLs, and it includes sorting, pagination, search and filtering. Math formulas work inside cells too.

There are catches. Responsive table options are a Premium feature as of November 2026, and automatic imports from a changing source need the Max plan. Free support runs through the community forum only.

Ninja Tables

Ninja Tables Create a Table screen with upload a file, Google Sheets and custom SQL query options

Ninja Tables lists 70,000+ active installations on WordPress.org (version 5.5.0, November 2026). It imports CSV, Excel and JSON for free and adds search, sorting and responsive layouts on the DataTables engine.

Google Sheets, custom SQL and conditional formatting need Pro. For statistical tables it fits mid-sized datasets that need search and sorting but no calculated values. There’s a separate walkthrough of Ninja Tables if you want the setup details.

Visualizer

Visualizer chart editor with the Source tab listing import from file, URL, database and manual data

Visualizer, from Themeisle, lists 20,000+ active installations (version 4.0.10, October 2026). It’s a charts plugin first, with tables as a second output type.

The free version centers on manual entry. CSV and Excel import, Google Sheets and database queries are Pro. It suits a small results table that sits next to a chart of the same numbers.

Flexible Table Block

Flexible Table Block editor with merged cells across rows and columns

Flexible Table Block lists 40,000+ active installations (version 3.10.0, November 2026). It extends the block editor’s table instead of adding a separate table manager.

It merges and splits cells, and it scrolls or stacks on mobile. Its listing mentions no sorting, search or import, so it’s best for a small cross-tabulation with grouped headers that you type in by hand.

If you want more candidates, start with this list of alternatives to TablePress.

How to import and sync statistical data

CSV, Excel and JSON files import for free on TablePress, wpDataTables and Ninja Tables. Google Sheets and database sources are where the paid tiers start.

Source TablePress wpDataTables Ninja Tables
CSV, Excel, JSON file Free Free (Lite) Free
Google Sheets Free via public CSV link Premium (API) Pro
SQL or database query Not listed Premium (MySQL) Pro (custom SQL)

The table reflects the plugin listings as of November 2026.

Importing CSV and Excel files

TablePress reads .xlsx, .xls, .ods, CSV, JSON and HTML. wpDataTables adds XML and serialized PHP arrays.

wpDataTables accepts comma, colon, semicolon, pipe and tab separated CSV, so pick semicolon for exports that use a comma as the decimal mark.

When a table already exists, TablePress can add a new one, replace the existing one or append rows to it. One limit on HTML sources: it imports only the first table it finds in an HTML file or URL.

Output from R or SPSS goes in as CSV.

Syncing from a Google Sheet

TablePress reads a Google Sheet through a public CSV link. Here’s how to build it.

  1. Share the sheet so anyone with the link can view it.
  2. Build the export link, which looks like https://docs.google.com/spreadsheets/d/{spreadsheet-id}/export?format=csv&gid={gid}. The gid value picks the worksheet.
  3. Open the link in a private window. A CSV or XLSX download with no login means the link works.
  4. In TablePress, open Import a Table, choose URL, paste the link and import.

Use the export link, not the address of the sheet itself. The plugin author says in the support forum that the regular sheet address pulls in interface text plus extra rows and columns.

Refreshing means repeating the import and choosing replace. The Automatic Periodic Table Import module in TablePress Max does it on a schedule, as often as once per minute, and has sent failure notifications since version 3.0 (TablePress documentation).

It’s a scheduled replace, not a live link. A cell edited a second ago shows up at the next run.

JSON and database sources

JSON loads as a file on TablePress and wpDataTables, and wpDataTables also reads nested JSON. For a refresher on how raw JSON becomes markup, see this guide to turning a JSON feed into an HTML table.

When the statistics already sit in MySQL, a database-backed table is the strongest option, because the table reads its rows from a query instead of an uploaded file. wpDataTables’ own statistical table tutorial starts from a plain SELECT on a statistics table.

For the underlying mechanics, see this guide on fetching data from a database in a WordPress page.

On the Premium side, the wpDataTables listing includes MySQL, MS SQL and PostgreSQL sources, SQL and WPDB query builders, and server-side processing.

How to format numbers, totals and notes in a statistical table

Give each statistic its own column, fix the decimal places per column and line up the digits. Totals belong in the footer section. Significance markers, sample size and source go in a note under the table.

Match the layout to the table type

Table type Rows hold Columns hold Footer row
Frequency table Categories of one variable Count, percent, cumulative percent Total count and 100%
Cross-tabulation Levels of the first variable Levels of the second variable, row total Column totals
Summary statistics One variable per row n, mean, standard deviation, minimum, maximum Overall row, if reported

A summary statistics table reports the descriptive statistics of each variable side by side, so readers can compare spread down the rows.

APA Style says to keep different indices, such as means and standard deviations, in different columns.

The tooling points the same way. wpDataTables applies one decimal-place setting to a float column, and its author says in the support forum that a column cannot mix precisions.

Decimals, alignment and separators

  • Pick one precision per statistic and hold it down the column. wpDataTables sets a global decimal-place value on its settings page, and each float column can override it.
  • APA Style left-aligns the stub column and generally centers the other cells, with no rule for decimals. Right alignment is what stacks the digits, and TablePress 3.0 added an option to right-align numbers and dates automatically.
  • For separators, wpDataTables lets you choose the thousands and decimal signs. Integer columns also get a Skip thousands separator box, so a year doesn’t render as 2,026.

So the style manual and legibility disagree on alignment. For scanning down a column, right-aligned digits at a fixed precision win.

Fonts with tabular numerals give every digit the same width, which keeps that stack straight, and a shortlist of fonts that suit tables is a good place to start.

Totals, means and formulas

TablePress calculates inside the cell. Formulas follow Excel syntax with English function names, and the documentation shows SUM and MEDIAN, with average also available as mean.

The same documentation says formulas work on pure numbers only, so date or text work belongs in Excel, followed by a CSV import.

wpDataTables adds sum, average, minimum and maximum rows to numeric columns, and since version 5.7 those calculation functions also run inside formula columns (the WordPress.org listing files the calculating tools under Premium).

A confidence interval or a regression coefficient belongs in R, SPSS or a spreadsheet. Import the finished file.

Notes, significance markers and sample size

Notes carry what the title and the cells can’t. A general note holds the source, abbreviations and anything that applies to the whole table. A specific note covers one row, column or cell, and asterisks beside p values get explained in a probability note.

APA Style also drops vertical borders and boxes around every cell, and allows a rule above the totals row when you need one.

In WordPress, the Table block caption holds the title and a paragraph block directly under the table holds the notes. TablePress tables embed by block or shortcode, so the note sits in the paragraph that follows.

How to make a statistical table sortable and mobile-friendly

Turn on sorting, search and pagination in the plugin, then pick a single mobile mode. Wide cross-tabulations do best with horizontal scroll. Narrow tables can stack their rows, and long summary tables can hide columns instead.

Sorting, search and pagination

  • wpDataTables float columns sort arithmetically. Numbers that use a comma as the decimal mark need a formatted-num sorting type in DataTables, which TablePress documents as a custom JavaScript snippet.
  • TablePress includes searching and filtering in the free version and lists advanced filtering under Premium.
  • The TablePress author says a table without a table head can’t use the DataTables library at all, so keep the header row.

Pagination suits a long frequency table. A summary table that fits one screen reads better without it, and the mechanics are covered in this explainer on how table pagination works.

Mobile layouts

Mode Fits Where to get it
Horizontal scroll Wide cross-tabulations TablePress checkbox (free), Flexible Table Block
Stacked or flipped rows Narrow tables, few columns TablePress Responsive Tables module (Premium), Ninja Tables, Flexible Table Block
Hidden columns Long summary tables wpDataTables, Ninja Tables

That clarifies the earlier Premium note on TablePress. The free version keeps a Horizontal Scrolling checkbox under Table Features for Site Visitors, and the stack, flip and collapse modes come with the module in Pro and Max.

wpDataTables’ own statistical table tutorial hides every column except Item and Profit on mobile and tablet. Its Master-detail add-on reveals the rest with one click.

Merged headers break the free scroll. The TablePress author says a rowspan stops the DataTables horizontal scrolling from working, and that the module’s JavaScript-free scroll mode handles merged cells.

WCAG 2.2 criterion 1.4.10 (Reflow, Level AA) asks for no two-dimensional scrolling at 320 CSS pixels wide, but W3C excepts data tables. A scrolling cross-tabulation passes, while the search field and pagination around it still have to reflow.

The CSS side of a scrolling wrapper is covered in this guide to making a table responsive.

How to make a statistical table accessible

Mark every header cell as a th, set scope to col or row, add a caption, and give merged headers the colgroup or rowgroup scope. W3C WAI states that visual styling alone does not make a table accessible, and the related criterion is WCAG 2.2 SC 1.3.1, Info and Relationships (Level A).

  • Simple tables use th cells in the header row and td cells for data.
  • Tables with both row and column headers need scope set to col or row.
  • Merged headers take colspan with scope colgroup, or rowspan with scope rowgroup, and every table should have thead, tbody and tfoot.
  • Multi-level headers use id and headers attributes to tie each cell to every header above it.

For the markup itself, this overview of accessible tables is a useful companion to the W3C tutorial pages.

The caption element sits directly inside the table and works as a short heading. A summary is only for complex tables, shouldn’t repeat the caption, and can live inside the caption or in a nearby element referenced by aria-describedby (W3C WAI notes that support for the second option is less widespread).

Deque University’s checklist adds a nuance. Scope isn’t always necessary, since most modern screen readers infer the column when every first-row cell is a th without scope.

That holds for one header row. A cross-tabulation with row and column headers needs scope, and getting th cells right is most of the work (see the walkthrough on HTML table headers).

Equalize Digital published a small add-on, TablePress Scoped Headers, that sets scope="col" on first-row headers and scope="row" on first-column headers.

Tool How scope gets onto the headers
Table block Added in HTML edit mode, which the block has kept since Gutenberg pull request 16154 (2019)
TablePress The tablepress_cell_tag_attributes filter, or the Scoped Headers add-on
Flexible Table Block Cell-level scope, id and headers controls, per its changelog

Check the rendered output on your own theme. The block behavior above is documented as of that 2019 change, not retested here.

When a WordPress table stops working

A client-side table starts to struggle in the low thousands of rows. Past that point, a server-side table, a summary table with a download, or a chart serves readers better.

The wpDataTables server-side processing documentation (reviewed November 2026) gives a few concrete numbers.

  • Standard tables can slow on some installations at 500 rows.
  • At 2,000 to 3,000 rows they slow down in general.
  • Around 10,000 rows the page may crash.
  • SQL query tables switch to server-side processing automatically at 2,000 rows, and it can’t be disabled.

The sources don’t agree on a number. The DataTables manual describes server-side mode for many thousands to millions of rows without a threshold, and the TablePress listing states no row limit.

The figures differ because each source describes a different layer: the library, one plugin, or a plugin that publishes no limit. Treat 2,000 rows as the point to test on a real phone.

Server-side processing hands paging, sorting and filtering to the database, so the browser draws only the current page (DataTables manual). In wpDataTables it’s a Premium feature backed by MySQL, and Ninja Tables says its DataTables engine loads rows page by page from the server.

The Table block has no such option. It stores every cell in the post content, so a long table is a long post.

Sorting thousands of rows in the browser is the kind of interaction Interaction to Next Paint measures. Google’s web.dev rates INP good at 200 milliseconds or less at the 75th percentile of page loads.

Readers comparing patterns across many categories are better served by a chart. A table is for looking up exact values in a few cells. And if people want the whole dataset, offer a CSV download beside a summary table.

The breakdown of charts versus tables spells out where each wins.

Past a few thousand rows, a summary table plus a chart is easier to read than a full dump (here are approaches to visualizing large data sets).

FAQ About Statistical Tables in WordPress

How do I add a chart that updates with my table?

In wpDataTables, build the chart from the table as its data source and switch on Follow table filtering in the Data range step. The chart then updates when readers sort or filter.

Charts accept only one string-type column. Every other column must hold integers or floats.

Can I edit a table after it is published?

Yes. A plugin stores the table separately and embeds it by block or shortcode, so one edit updates every page that shows it.

A Table block table lives inside the post, so you edit it there. A table imported from a file or Google Sheet needs a re-import with replace, or a scheduled import.

Can I export a WordPress table back to CSV?

Yes, with TablePress, which exports CSV, HTML and JSON. The sources disagree on Excel. The WordPress.org listing names it as an export format, while the TablePress documentation says Excel files are import only.

Check the export screen on your version before promising an Excel file to anyone.

Does the Classic Editor support tables?

No. The Table block exists only in the block editor, so a site on the Classic Editor needs a plugin.

TablePress covers that case by inserting each table through a shortcode.

Checking Statistical Tables in WordPress After Updates

Every core or plugin update is a reason to recheck your statistical tables, starting with the features that depend on plugin-specific behavior.

As of November 9, 2026, the WordPress.org listings for TablePress, wpDataTables and Ninja Tables each show testing up to WordPress 7.1.4 and require PHP 7.4 or newer.

WordPress 7.0 set the same minimum and WordPress.org recommends PHP 8.3 or newer (WordPress.org requirements page), so one PHP upgrade covers the core and all three plugins.

Test on a staging copy, and check the numbers before the layout. Open the cross-tabulation with merged headers and horizontal scroll, look at the last-run status of any scheduled Google Sheets import, and view the rendered markup to confirm the header scope attributes survived.

A plugin table buys sorting and sync at the price of an update dependency that the Table block doesn’t carry.

When an update fails outright, this guide to a failed WordPress plugin update covers the recovery steps.

Sanja Pajic
Sanja Pajic

Full Stack Web Developer

Articles: 37

Get wpDataTables tips before your next table build

Practical guides for tables and charts in WordPress, release notes, and early access to promotions. Pick your topics and unsubscribe anytime.

Keep me posted