CSV Calculated Column (Formulas)
Spreadsheet formulas for whole CSV and Excel files, right in your browser.
Try before you buy.
- Free preview: the counts and the first rows of the table with your new columns (up to 10; a single row is shown with its new values hidden).
- Locked until you unlock it: download and copy.
- Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.
Ways to unlock shows how to get the full result.
Printing this result is locked in the free preview.
1. Table
Open a CSV or Excel file, or paste rows copied from a spreadsheet (with the header row).
Or paste the table (from Excel, Google Sheets or a CSV)
2. New columns
Write [Column] for this row’s value, text in "quotes", and spreadsheet functions such as IF, ROUND or DATEDIFF. Inside SUM([Column]), AVERAGE, COUNTIF … a column means the whole column; [@Column] always means this row.
Save or reuse formulas
A set keeps every new column’s name, formula and decimals, where the columns go and how errors are written. Using a set replaces the columns above. Sets are kept in this browser only: download one to use it on another device or to share it.
Functions (119) — search and insert
Math
-
ABS(number)The number without its sign.
ABS([Change]) -
SIGN(number)1 for a positive number, −1 for a negative one, 0 for zero.
SIGN([Balance]) -
ROUND(number, [digits])Rounds to a number of decimal places, halves away from zero (2.5 → 3, −2.5 → −3). Negative digits round to tens, hundreds…
ROUND([Price] * 1.18, 2) -
ROUNDUP(number, [digits])Rounds away from zero.
ROUNDUP([Hours], 0) -
ROUNDDOWN(number, [digits])Rounds towards zero.
ROUNDDOWN([Score], 1) -
TRUNC(number, [digits])Cuts off decimal places (towards zero).
TRUNC([Amount]) -
INT(number)Rounds down to a whole number (−2.5 → −3).
INT([Age]) -
MROUND(number, multiple)Rounds to the nearest multiple (halves away from zero).
MROUND([Price], 0.05) -
CEILING(number, [significance], [mode])Rounds up to a multiple of the significance (default 1); mode ≠ 0 rounds negative numbers away from zero.
CEILING([Weight], 0.5) -
FLOOR(number, [significance], [mode])Rounds down to a multiple of the significance (default 1); mode ≠ 0 rounds negative numbers towards zero.
FLOOR([Minutes], 15) -
MOD(number, divisor)The remainder of a division; it has the sign of the divisor (MOD(−3, 2) = 1).
MOD(ROW(), 2) -
QUOTIENT(numerator, denominator)The whole-number part of a division.
QUOTIENT([Minutes], 60) -
POWER(number, power)A number raised to a power (the same as ^).
POWER(1 + [Rate], [Years]) -
SQRT(number)The square root.
SQRT([Area]) -
EXP(number)e raised to a power.
EXP([Rate]) -
LN(number)The natural logarithm.
LN([Value]) -
LOG(number, [base])The logarithm to a base (10 when left out).
LOG([Value], 2) -
LOG10(number)The logarithm to base 10.
LOG10([Value]) -
PI()π = 3.14159265358979.
PI() * [Radius] ^ 2
Logic
-
IF(condition, value if true, [value if false])One value when the condition is true, another when it is false (FALSE when left out).
IF([Amount] > 1000, "Large", "Small") -
IFS(condition1, value1, condition2, value2, …)The value of the first condition that is true (#N/A when none is).
IFS([Score] >= 90, "A", [Score] >= 75, "B", TRUE, "C") -
SWITCH(value, case1, result1, …, default)Compares a value with each case and returns the matching result, or the default.
SWITCH([Code], "N", "North", "S", "South", "Other") -
AND(condition1, condition2, …)TRUE when every condition is true.
AND([Paid], [Shipped]) -
OR(condition1, condition2, …)TRUE when any condition is true.
OR([Region] = "North", [Region] = "East") -
XOR(condition1, condition2, …)TRUE when an odd number of conditions are true.
XOR([A], [B]) -
NOT(condition)Turns TRUE into FALSE and FALSE into TRUE.
NOT(ISBLANK([Email])) -
IFERROR(value, value if error)The value, or the second value when the first is an error.
IFERROR([Profit] / [Revenue], 0) -
IFNA(value, value if #N/A)The value, or the second value when the first is #N/A.
IFNA(XLOOKUP([@ID], [Code], [Name]), "unknown")
Text
-
CONCAT(text1, text2, …)Joins texts (the same as &).
CONCAT([First], " ", [Last]) -
TEXTJOIN(delimiter, ignore empty, text1, …)Joins texts with a delimiter, optionally skipping empty ones. A column joins the whole column.
TEXTJOIN(", ", TRUE, [@Street], [@City], [@Zip]) -
LEFT(text, [characters])The first characters (1 when left out).
LEFT([Postcode], 3) -
RIGHT(text, [characters])The last characters (1 when left out).
RIGHT([Account], 4) -
MID(text, start, characters)Characters from the middle: from position start (1 is the first).
MID([SKU], 4, 2) -
LEN(text)How many characters the text has (an emoji counts as one).
LEN([Description]) -
UPPER(text)CAPITAL LETTERS.
UPPER([Code]) -
LOWER(text)small letters.
LOWER([Email]) -
PROPER(text)A Capital At The Start Of Every Word.
PROPER([Name]) -
TRIM(text)Removes spaces at both ends and turns runs of spaces inside into one (tabs, line breaks and no-break spaces count as spaces).
TRIM([Name]) -
CLEAN(text)Removes control characters (codes 0–31) such as line breaks.
CLEAN([Notes]) -
SUBSTITUTE(text, old, new, [instance])Replaces every “old” (or only the n-th one) with “new”.
SUBSTITUTE([Phone], " ", "") -
REPLACE(text, start, characters, new text)Replaces characters at a position with new text.
REPLACE([Card], 1, 12, "XXXX-XXXX-XX") -
FIND(search for, text, [start])Where text is found (case matters); #VALUE! when it is not there.
LEFT([Email], FIND("@", [Email]) - 1) -
SEARCH(search for, text, [start])Where text is found (any case, wildcards * and ?); #VALUE! when it is not there.
IF(ISNUMBER(SEARCH("refund", [Note])), "Refund", "") -
TEXTBEFORE(text, delimiter, [instance])The text before the n-th delimiter (a negative n counts from the end); #N/A when there is none.
TEXTBEFORE([Email], "@") -
TEXTAFTER(text, delimiter, [instance])The text after the n-th delimiter (a negative n counts from the end); #N/A when there is none.
TEXTAFTER([Email], "@") -
REPT(text, times)The text repeated a number of times.
REPT("★", [Stars]) -
EXACT(text1, text2)TRUE when two texts are the same, case included.
EXACT([Code], UPPER([Code])) -
VALUE(text)Text that shows a number (or a date, as its serial number) as a number. An empty cell is 0; empty text is #VALUE!.
VALUE(SUBSTITUTE([Price], "USD", "")) -
TEXT(value, format)A number or date as text in a format: "0.00", "#,##0", "0%", "000000", "#,##0.0,," (millions), "# ?/?" (fractions), "yyyy-mm-dd", "dd mmm yyyy", "hh:mm AM/PM", "dddd", "[h]:mm" (hours past 24).
TEXT([Date], "dd mmm yyyy") -
CHAR(code)The character with a Unicode code (10 is a line break).
[Street] & CHAR(10) & [City] -
CODE(text)The Unicode code of the first character.
CODE([Grade])
Date and time
-
DATE(year, month, day)A date from year, month and day; months and days roll over (month 13 is January of the next year).
DATE([Year], [Month], 1) -
TIME(hour, minute, second)A time of day from hours, minutes and seconds.
TIME([Hour], [Minute], 0) -
DATEVALUE(text)Text that shows a date as a date.
DATEVALUE([Invoice date]) -
TIMEVALUE(text)Text that shows a time as a time of day.
TIMEVALUE([Start]) -
YEAR(date)The year of a date.
YEAR([Order date]) -
MONTH(date)The month of a date (1–12).
MONTH([Order date]) -
DAY(date)The day of the month (1–31).
DAY([Due]) -
HOUR(time)The hour (0–23).
HOUR([Timestamp]) -
MINUTE(time)The minute (0–59).
MINUTE([Timestamp]) -
SECOND(time)The second (0–59).
SECOND([Timestamp]) -
WEEKDAY(date, [type])The day of the week: type 1 (default) Sunday = 1 … Saturday = 7; 2: Monday = 1 … Sunday = 7; 3: Monday = 0 … Sunday = 6; 11–17 start on Monday … Sunday.
IF(WEEKDAY([Date], 2) > 5, "Weekend", "Weekday") -
WEEKNUM(date, [type])The week of the year: the week with 1 January is week 1, weeks start on Sunday (type 1) or Monday (type 2, 11); type 21 is the ISO week.
WEEKNUM([Date], 2) -
ISOWEEKNUM(date)The ISO 8601 week (weeks start on Monday; week 1 has the year’s first Thursday).
ISOWEEKNUM([Date]) -
TODAY()Today’s date on your device.
DATEDIF([Birthday], TODAY(), "Y") -
NOW()The date and time now on your device.
(NOW() - [Created]) * 24 -
EDATE(date, months)The same day a number of months later (or earlier); the 31st becomes the month’s last day.
EDATE([Start], 12) -
EOMONTH(date, months)The last day of the month, a number of months later (0 for this month).
EOMONTH([Invoice date], 0) -
DATEDIF(start, end, unit)Whole years ("Y"), months ("M") or days ("D") between two dates; "MD", "YM" and "YD" ignore the larger units. The start must not be after the end.
DATEDIF([Joined], TODAY(), "Y") -
DATEDIFF(start, end, [unit])The signed difference end − start in whole units: "D" days (default), "W" weeks, "M" months, "Y" years, "H" hours, "N" minutes, "S" seconds (this engine’s own function).
DATEDIFF([Ordered], [Delivered], "D") -
DAYS(end, start)The number of days from start to end.
DAYS([Due], [Invoice date]) -
NETWORKDAYS(start, end, [holidays])Working days (Monday to Friday) from start to end, both included, without the holidays (a column of dates, or one date).
NETWORKDAYS([Opened], [Closed])
Whole column
-
SUM(value1, value2, …)Adds numbers. With a column, like SUM([Amount]), the whole column’s total. Blank cells and text are skipped.
[Amount] / SUM([Amount]) -
AVERAGE(value1, value2, …)The mean. Blank cells and text are skipped.
[Score] - AVERAGE([Score]) -
MIN(value1, value2, …)The smallest number (or the earliest date).
MIN([Order date]) -
MAX(value1, value2, …)The largest number (or the latest date).
MAX([Order date]) -
MEDIAN(value1, value2, …)The middle number.
MEDIAN([Price]) -
COUNT(value1, value2, …)How many numbers (and dates) there are.
COUNT([Amount]) -
PRODUCT(value1, value2, …)Multiplies numbers.
PRODUCT([@Length], [@Width], [@Height]) -
STDEV(value1, value2, …)Sample standard deviation (n − 1).
([Score] - AVERAGE([Score])) / STDEV([Score]) -
STDEVP(value1, value2, …)Population standard deviation (n).
STDEVP([Score]) -
VAR(value1, value2, …)Sample variance (n − 1).
VAR([Score]) -
VARP(value1, value2, …)Population variance (n).
VARP([Score]) -
COUNTA(value1, …)How many cells are not empty.
COUNTA([Email]) -
COUNTBLANK(column)How many cells are empty.
COUNTBLANK([Phone]) -
LARGE(column, k)The k-th largest number.
LARGE([Sales], 3) -
SMALL(column, k)The k-th smallest number.
SMALL([Time], 1) -
SUMPRODUCT(column1, column2, …)Multiplies the columns row by row and adds the products (text counts as 0).
SUMPRODUCT([Quantity], [Price]) -
RANK(number, [column], [order])The rank of a number in a column: 1 for the largest (order 0, as in spreadsheets) or the smallest (order 1). Ties share a rank. RANK([Sales]) ranks this row’s Sales.
RANK([Sales])
Rows
-
ROW()The row’s number: 1 for the first data row.
"INV-" & TEXT(ROW(), "0000") -
ROWS()How many data rows the table has.
ROW() / ROWS() -
PREV(value, [n], [default])The value n rows above (1 when left out); the default (blank) on the first rows.
[Reading] - PREV([Reading]) -
NEXT(value, [n], [default])The value n rows below (1 when left out); the default (blank) on the last rows.
NEXT([Start]) - [Start] -
RUNNING_SUM(value)The running total from the first row to this one.
RUNNING_SUM([Amount]) -
RUNNING_COUNT(value)How many numbers there are from the first row to this one.
RUNNING_COUNT([Amount]) -
RUNNING_AVERAGE(value)The average from the first row to this one.
RUNNING_AVERAGE([Score]) -
RUNNING_MIN(value)The smallest number so far.
RUNNING_MIN([Price]) -
RUNNING_MAX(value)The largest number so far.
RUNNING_MAX([Price]) -
PERCENT_OF_TOTAL(value)This row’s share of the column total, in percent (25 for a quarter).
ROUND(PERCENT_OF_TOTAL([Sales]), 1)
Groups and lookups
-
COUNTIF(column, criterion)How many cells of a column meet a criterion: "North", ">100", "<>", "A*" (wildcards * and ?).
COUNTIF([Email], [@Email]) > 1 -
SUMIF(column, criterion, [sum column])Adds the sum column (or the column itself) where the column meets the criterion.
[Amount] / SUMIF([Region], [@Region], [Amount]) -
AVERAGEIF(column, criterion, [average column])The average of the average column (or the column itself) where the column meets the criterion.
AVERAGEIF([Team], [@Team], [Score]) -
COUNTIFS(column1, criterion1, column2, criterion2, …)How many rows meet every criterion.
COUNTIFS([Region], [@Region], [Status], "Paid") -
SUMIFS(sum column, column1, criterion1, …)Adds the first column where every criterion is met.
SUMIFS([Amount], [Region], [@Region], [Status], "Paid") -
AVERAGEIFS(average column, column1, criterion1, …)The average of the first column where every criterion is met.
AVERAGEIFS([Amount], [Region], [@Region], [Status], "Paid") -
MAXIFS(max column, column1, criterion1, …)The largest value of the first column where every criterion is met.
MAXIFS([Amount], [Region], [@Region], [Status], "Paid") -
MINIFS(min column, column1, criterion1, …)The smallest value of the first column where every criterion is met.
MINIFS([Amount], [Region], [@Region], [Status], "Paid") -
XLOOKUP(lookup value, lookup column, return column, [if not found])Finds the first row whose lookup column equals the value (any case) and returns that row’s value of the return column.
XLOOKUP([@Manager ID], [Employee ID], [Name], "—")
Information
-
ISBLANK(value)TRUE when the cell is empty.
IF(ISBLANK([Phone]), "missing", [Phone]) -
ISNUMBER(value)TRUE for a number or a date (text such as "12.5" counts, as when a spreadsheet opens the file).
ISNUMBER([Amount]) -
ISTEXT(value)TRUE for text that is not a number, a date or TRUE/FALSE.
ISTEXT([Code]) -
ISLOGICAL(value)TRUE for TRUE or FALSE.
ISLOGICAL([Active]) -
ISDATE(value)TRUE when the value is, or reads as, a date or time (this engine’s own function).
ISDATE([Due]) -
ISERROR(value)TRUE when the value is an error (#DIV/0!, #VALUE!, #N/A …).
ISERROR([A] / [B]) -
ISERR(value)TRUE when the value is an error other than #N/A.
ISERR([A] / [B]) -
ISNA(value)TRUE when the value is #N/A.
ISNA(XLOOKUP([@ID], [Code], [Name])) -
ISEVEN(number)TRUE for an even number.
ISEVEN(ROW()) -
ISODD(number)TRUE for an odd number.
ISODD(ROW()) -
NA()The error #N/A (for “no value”).
3. Preview and apply
Locked in the free preview. Opens the ways to unlock this result.
Locked in the free preview. Batch runs unlock with a pass.
Locked in the free preview. Query results unlock with a pass.
About the CSV Calculated Column (Formulas)
Add new columns to a CSV or Excel file with the formulas you know from spreadsheets — [Price] * [Qty], IF([Amount] > 1000, "Large", "Small"), DATEDIFF([Ordered], [Delivered]) — and apply them to every row at once, even in files with hundreds of thousands of rows that are slow or impossible to open in a spreadsheet. Over 100 functions cover arithmetic, logic, text, dates, whole-column totals (SUM([Amount])), group totals (SUMIF, COUNTIFS), lookups inside the table (XLOOKUP), ranks, running totals, percent of total, and the previous or next row.
Type a formula and the first rows update as you type, with a clear message pointing at any mistake. Then press Apply to work out every row and, with a pass, download a CSV or an Excel file (where new numbers and dates are real numbers and dates) or copy the result into a spreadsheet. The formulas are worked out by this page in your browser, by a formula engine that never runs your text as code; the file is never uploaded.
Without a pass, the free preview shows the first rows with your new columns; the CSV and Excel files and the copy unlock with a Pro pass.
How to use it
- Open a CSV or Excel file, or paste rows copied from a spreadsheet with the header row. (No file at hand? Press Try it with an example sales table.)
- Name the new column and type its formula. Use Insert a column… to add a column name, or search the Functions list and press Insert. Column names go in brackets:
[Unit price]. - Watch the preview of the first rows: a formula with a mistake shows what is wrong and marks the place. Add more columns with Add a column — each one can use the columns before it.
- Choose where the new columns go, how many decimals to show and how errors are written, then press Apply to all rows and — with a pass, or after unlocking this result — download the CSV or Excel file, or copy it. Save the formulas under Save or reuse formulas to run them again on the next file.
Examples
Total = [Price] * [Qty] Tax = ROUND([Total] * 0.18, 2) Running total = RUNNING_SUM([Total])
Price 120.50, Qty 3 → Total 361.50, Tax 65.07; the running total adds each row’s Total to the rows above it.
Share % = ROUND(PERCENT_OF_TOTAL([Sales]), 1) Share of region = [Sales] / SUMIF([Region], [@Region], [Sales])
Sales of 250 out of 1,000 → 25 (%); out of a region total of 500 → 0.5.
Days to pay = DATEDIFF([Invoice date], [Paid on]) Due = EDATE([Invoice date], 1) Day = TEXT([Invoice date], "dddd")
2026-01-09 → 2026-02-15 gives 37 days; due 2026-02-09; Friday.
Name = PROPER(TRIM([Name])) Domain = TEXTAFTER([Email], "@") Duplicate = COUNTIF([Email], [@Email]) > 1
" asha RAO " → "Asha Rao"; asha@example.com → example.com; TRUE for every e-mail that appears more than once.
Common uses
- Adding totals, taxes, margins and discounts to an exported order or invoice list.
- Working out ages, days to pay, overdue flags and due dates from date columns.
- Ranking sales people or products, and showing each one’s share of the total or of its region.
- Cleaning and combining text columns (names, codes, e-mails) before an import.
- Running totals and changes from the previous row in bank statements, meter readings or stock lists.
Writing formulas
- Columns:
[Price]is this row’s Price. Names are matched without regard to case or extra spaces; a name with]in it is written with]]. - Text goes in double quotes:
"North"; a quote inside text is doubled:"6"" pipe". Numbers use a decimal point in formulas:0.18. - Operators, from loosest to tightest: comparisons
= <> < > <= >=, then&(joins text),+ -,* /,^(power),%after a number (18%is 0.18), and a minus sign before a value — so-2^2is 4, and2^3^2is 64, as in spreadsheets. - Arguments are separated by commas or semicolons:
ROUND([Amount], 2)andROUND([Amount]; 2)are the same. A leading=is optional. - A formula can use the file’s columns and the new columns above it. A new column named like an existing one replaces it: its formula reads the old values, later formulas the new ones.
A whole column or this row
Inside functions that work on ranges — SUM, AVERAGE, MIN, MAX, COUNT, MEDIAN, STDEV, LARGE, RANK, COUNTIF, SUMIF, XLOOKUP and the like — a column in brackets means the whole column, as SUM(B:B) does in a spreadsheet: [Amount] / SUM([Amount]) is each row’s share. Everywhere else it means this row’s value. [@Amount] always means this row, so SUM([@Q1], [@Q2], [@Q3]) adds three cells of the row while SUM([Q1], [Q2]) adds two whole columns (the page warns when a formula gives every row the same result).
Row functions
These look beyond the current row: ROW() (1 for the first data row) and ROWS(); PREV(value, n, default) and NEXT(…) (also called LAG and LEAD) for the value n rows above or below; RUNNING_SUM, RUNNING_COUNT, RUNNING_AVERAGE, RUNNING_MIN and RUNNING_MAX from the first row down to this one; PERCENT_OF_TOTAL(value), this row’s share in percent; and RANK(number, column, order) — 1 for the largest (or, with order 1, the smallest), ties sharing a rank as in RANK.EQ. RANK([Sales]) ranks each row’s Sales. They follow the order of the rows in the file.
How values are read
CSV cells are text, so each cell is read the way a spreadsheet reads it when it opens the file: 1,234.50, $1,200, (300) (a negative), 12.5% and 1.2E3 are numbers; with decimal comma chosen, 1.234,50 is. Dates such as 2026-03-15, 15/03/2026 (or 03/15/2026 with month first), 15.03.2026, 15 Mar 2026 and March 15, 2026, with or without a time, are dates (two-digit years 00–69 are 2000–2069, 70–99 are 1970–1999); a time zone such as Z or +05:30 is converted to UTC. An empty cell counts as 0 in arithmetic and as "" in text. Text functions get the cell exactly as written, so LEFT([Code], 2) of 007 is 00.
Dates are numbered as in spreadsheets (days since 30 December 1899, the time of day as the fraction): a date plus a number is a date, one date minus another is a number of days, and one time minus another is a duration such as 08:30 (multiply it by 24 for hours, or show it with TEXT(…, "[h]:mm")). Whole numbers of 16 or more digits, such as card and order numbers, are compared by their exact digits, so COUNTIF([Order], [@Order]) > 1 finds true duplicates. New dates are written as 2026-03-15 (or 2026-03-15 14:30); use TEXT([Date], "dd/mm/yyyy") for another style.
Errors
A row whose value cannot be worked out shows a spreadsheet error instead of stopping the whole file: #DIV/0! (division by zero), #VALUE! (text where a number or date is needed), #N/A (nothing found, from XLOOKUP or IFS), #NUM! (an impossible number, such as the square root of −1). Point at a red cell in the preview to see why; after Apply the page lists the first rows with errors in each column. Wrap a formula in IFERROR(…, 0) to put another value there, or choose Leave the cell empty.
Limitations
- Tables that open in the page: CSV and TSV files up to 100 MB and workbooks up to 50 MB (one sheet at a time).
- Formulas work on the columns of one table: there are no cell addresses such as A1 or B2:B9, no other sheets or files, and no array formulas.
- Function results follow the OpenFormula standard that LibreOffice also follows; a few differ slightly from Excel’s in edge cases (CEILING and FLOOR of negative numbers with no mode, DATEDIF’s "MD" unit, which counts the days after the last whole month). Month and day names in TEXT() are English.
- There are no regular-expression or random-number functions, so every result can be checked and repeated.
Privacy
On this device: nothing is sent
Everything happens in your browser. What you enter or open here is not uploaded or stored by MySmartCoPilot.
Frequently asked questions
What do I get without a pass?
Without a pass, CSV Calculated Column (Formulas) shows the counts and the first rows of the table with your new columns (up to 10; a single row is shown with its new values hidden). Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.
How do I add a column that multiplies two columns in a CSV?
Open the file, name the new column (for example Total) and type [Price] * [Quantity] — use the exact column names, in brackets. Press Apply to all rows and, with a pass, download the CSV or Excel file.
How do I calculate the number of days between two dates?
Use DATEDIFF([Start], [End]) for the days from Start to End (negative when End is earlier), or simply [End] - [Start]. DATEDIFF([Start], [End], "M") counts whole months, "Y" whole years, "H" hours. DATEDIF([Birthday], TODAY(), "Y") gives an age in whole years.
How do I make a running total or a percent-of-total column?
RUNNING_SUM([Amount]) adds up Amount from the first row to each row; ROUND(PERCENT_OF_TOTAL([Amount]), 1) gives each row’s share of the column total in percent; [Amount] / SUMIF([Region], [@Region], [Amount]) gives its share of its region.
Is it safe to type formulas here?
Yes. Formulas are read by a small formula engine written for this page: it only knows its own functions and never runs your text as program code, so a formula cannot do anything but calculate. The file stays in your browser.
Will Excel see numbers and dates in the download?
Yes, in the Excel download: new columns keep their numbers, dates (as real Excel dates), TRUE/FALSE and text, with the decimals you chose; the file’s own columns that are entirely numbers become numbers too, while codes such as 007 stay text. The CSV download writes dates as 2026-03-15, which Excel and Google Sheets read as dates.
Can I save my formulas to use again?
Yes. Under Save or reuse formulas, give the set a name and press Save: every new column’s name, formula and decimals is kept in this browser, so next month’s export needs one click on Use. Download formulas saves the set as a .json file to open on another device or to share; the formulas work on any table with the same column names.