Importing a BoQ from Excel

On this page
  1. Which import do you need?
  2. Preparing the Excel file
  3. How to start an import
  4. Import statuses
  5. The import page
  6. How to fix the column mapping
  7. How to correct rows
  8. Checks that block saving
  9. How to resolve unit-price conflicts
  10. How to save the import to the BoQ
  11. Saving corrections back into the Excel file
  12. Working on one import together
  13. When an import page cannot be edited
  14. How to delete an import
  15. Import with analyses
  16. Import with applied prices (on behalf of a subcontractor)
  17. Limits
  18. Common questions
  19. Related
WhereBoQ editor → Exchange (Обмен) → Import (Импорт), or right-click a category → Import into subsection (Импортиране в подобект). The import page: /projects/{project}/boq-imports/{import}?evt={boq}
Who canProject permission Offers (Оферти) at Edit. Picking a file from the File Manager also needs File manager (Файлов мениджър) at View. The structure import works on the Free plan (in offer BoQs); import with analyses needs resource analysis, so a paid plan or a trial.
RelatedWorking in the BoQ editor, Exporting, Resource analysis, Self-managed subcontractors and self-contracts

Which import do you need?

ImportUse it whenWhere it startsSaved as a draft?
Import (structure import)The usual case: the file has categories and positions with units, quantities and optionally unit prices. Rows are added to the BoQ.Import → hub → Start importYes. A shared import page you can leave and continue.
Import with analyses (Импортиране с анализи)The file also holds a resource analysis (materials, machinery, labor, additional costs) for every position.Import → hub → Import with analysesNo. One dialog, finished in one go.
Import with applied pricesOnly when you record a self-managed subcontractor's priced offer on their behalf. Matching rows are repriced, new rows added, rows missing from the file removed.Import on the on-behalf offerNo.
Fill prices for a subcontractInside Contract with a contractor: reads prices for the selected lines only. Nothing is written to the BoQ.Import from Excel in that dialogNo.

Import works on budget drafts, offers (including offers recorded on behalf of a self-managed subcontractor) and offer-request bases. It is not possible on the accepted budget or a signed contract: change those through a change order. On a quantity-only offer-request base, prices in the file are ignored.

Preparing the Excel file

BuildColab reads most bills of quantities as they come from clients. The cleaner the file, the less you correct afterwards. Follow these rules:

  • Use .xlsx. .xls is accepted but not recommended: indentation cannot be read, it cannot be saved back as a corrected version, and the export into the original file does not work with it. CSV and PDF are not accepted.
  • One flat table per sheet, no merged cells. A section title merged across several columns falls outside the description column, so the row arrives with an empty description and is dropped.
  • A header row near the top. BuildColab looks for the column titles in the first 15 rows of each sheet; row 1 is safest. A long preamble above the table can hide the header.
  • Categories and positions in the same columns. A category is a row with a description but no unit and no quantity. A position is a row with a description and a unit and/or quantity.
  • Hierarchical codes for nesting. Number the rows 1 → 1.1 → 1.1.1. Codes may also be numeric (01, 0101, 010101) or split over several columns. Without codes, Excel indentation (.xlsx only) or leading spaces in the description are used when there are at least two levels.
  • Numbers may use a comma or a dot as decimal separator and spaces between thousands (12,50 · 1 234.5). An empty or unreadable quantity imports as 0; an empty unit price imports as "no price".
  • No totals inside the table, or leave them — they are skipped. Rows such as "Общо", "Всичко", "Сума", "Междинна сума", "Total", "Sub-total", "ДДС", "VAT", "Пренос", "carried forward" and notes/legend lines without a unit are ignored, as are header repeats, decorative rows and trailing categories with nothing under them.
  • Several sheets are all imported. In a workbook with several sheets each sheet becomes a top-level category named after the sheet; a single-sheet workbook is imported without that extra level. Delete a summary sheet that repeats the other sheets in Excel before importing, or everything is imported twice.

Import file format

Use this layout for a file you prepare yourself. The column order is free; the titles below are recognized automatically (upper or lower case).

ColumnFieldRequired?Recognized header titlesWhat to put in it
ACode (Код)RecommendedКод, Номер, №, No, Номер на СМРHierarchical code: 1, 1.1, 1.1.1 … for categories and positions. Defines the nesting.
BDescription (Описание)YesОписание, Наименование, Име, СМР, Задача, Наименование на СМР, Описание на строително-монтажни работиCategory name or position description. Never empty.
CUnit of measure (Мерна единица)Yes for positionsМерна единица, Мярка, Мерна ед., Ед. мярка, м.ед., Ед. изм.m, m², m³, pcs, kg … Leave empty on category rows.
DQuantity (Количество)Yes for positionsКоличество, К-во, Кол.Number. Leave empty on category rows.
EUnit price (Единична цена)NoЕдинична цена, Цена, Ед. цена, Цена за единица, Ед. стойност, Цена без ДДСNumber, 0 or more. Ignored on quantity-only BoQs.
FNote (Забележка)NoЗабележка, Заб., ЗабележкиClarification that tells two otherwise identical positions apart, for example "Floor 2".

Example of a correctly prepared sheet:

КодОписаниеМерна единицаКоличествоЕдинична ценаЗабележка
1Груб строеж
1.1Изкопни работи
1.1.1Машинен изкопm³4508,50
1.1.2Ръчен изкопm³3532,00
2Довършителни работи
2.1Гипсова шпакловка по стениm²1 2506,40Етаж 1
2.2Гипсова шпакловка по стениm²1 1806,40Етаж 2

Rows 1, 1.1 and 2 have no unit and no quantity, so they become categories; 1.1.1 nests under 1.1 because of its code. The two plastering rows are kept apart by their notes.

How to start an import

  1. Open the BoQ you want to fill. To import at the top level, click Import (Импорт) in the action bar. To import into one category, right-click it → Import into subsection (Импортиране в подобект); all top-level rows of the file then land under that category.
  2. The dialog Import BoQ (Импорт на КСС) opens. Under Imports in progress (Импорти в процес) it lists every import already started on this BoQ.
  3. Under New import (Нов импорт), choose the file: File from device (Файл от устройството) → Choose a file or drag the file into the tile; or File from the File Manager (Файл от Файловия мениджър) → pick an .xls/.xlsx file from the project files → Choose.
  4. Click Start import (Започни импорт). The import page opens.

Picking a device file clears a File Manager pick and vice versa. Files up to 200 MB are accepted. If the import cannot be created you see The import could not be created. The workbook is kept as a hidden source file of the BoQ.

The Import BoQ hub with imports in progress and the two file source tiles
Figure: The import hub of a BoQ
  1. Imports in progress: one card per import started on this BoQ, with its status.
  2. The card's Continue and Delete buttons.
  3. File from device with Choose a file and drag and drop.
  4. File from the File Manager for a file already in the project.
  5. Import with analyses for a file with resource analyses.
  6. Start import creates the import and opens the import page.

Import statuses

Status (EN)Status (BG)MeaningWhat you can do
In progressВ процесThe import is being prepared and corrected.Continue or Delete.
Saving to the projectЗаписва се в проектаThe import is being written to the BoQ.Wait; Continue and Delete are inactive.
Saved to the projectЗаписан в проектаThe import is in the BoQ.View only, or delete the import record.

A card also shows "Created {date} · last change {date}", the number of corrected rows, a red line Saving to the project failed: {message} after a failed save, or "The uploaded workbook is no longer available, so this import can only be deleted."

The import page

The import page header shows Back to the BoQ (Назад към КСС), the file name, the status, Last edited by {name}, the save indicator (Saving…, Saved, or in red Not saved — check your connection), the Label option, Save to Excel file and Save to project. Two tabs sit below:

  • File (Файл) — the original workbook, read-only, so you can compare.
  • Recognition (Разпознаване) — the grid where you check and correct everything. It opens by default.

The first time anyone opens a new import, BuildColab recognizes it automatically (a Processing overlay): it maps the columns, decides the type of every row and builds the nesting. The result is stored, so everyone who opens the import later sees the same starting point. If recognition fails: The data could not be recognized.

How to fix the column mapping

The bar Column mapping (Разпределение на колоните) above the grid shows which column holds what, as colored pills on the column headers.

  1. Click Edit columns (Редактирай колоните), or click a pill directly.
  2. Click a column's pill and choose its type. Not mapped (Не е зададена) ignores the column. When Code or Description is already mapped, the option "+ Description" adds this column to it (the texts are joined).
  3. Click Save columns (Запази колоните), or Discard changes.
Type (EN)Type (BG)Required?Rule
CodeКодNoMay span several columns (joined as a.b.c). Edits to code cells are not stored.
DescriptionОписаниеYesMay span several columns (joined with spaces).
UoMм.ед.YesOne column only.
QtyК-воYesOne column only.
Unit priceЕд. ценаNoNot offered on quantity-only BoQs.
NoteЗабележкаNoTyping a note on a sheet without a note column adds one automatically.

Saving the columns re-runs recognition for that sheet and recalculates row types and nesting there; switching sheets while editing discards unsaved mapping changes.

The import page Recognition tab with colored column pills, row types and a category tree
Figure: The Recognition tab of the import page
  1. The Label checkbox and label name.
  2. Save to project commits the import to the BoQ.
  3. The Column mapping bar with Edit columns.
  4. Colored column pills: Code, Description, UoM, Qty, Unit price, Note.
  5. The Row type column: Work items, Subsection or Unassign.
  6. A category bar with its tree line; hover it for the ← / → depth arrows.
  7. The sheet tabs below the grid.

How to correct rows

Every row has a Row type (Вид на реда) dropdown:

Type (EN)Type (BG)Meaning
Work itemsСМРA position: imported with description, unit, quantity, price and note.
SubsectionПодобектA category, shown as a blue bar.
UnassignОтмаркирайIgnored, not imported (totals, notes, decorations).
  • Right-click a row for + Assign as Subsection, + Assign as Work items and - Unassign.
  • Hover a category bar to show the arrows: → nests it (with its subtree) one level deeper, ← moves it one level up. Positions always belong to the nearest category above them. Click the bar to collapse or expand it, and click its name to rename it.
  • Click a cell of a position to edit its description, unit, note, quantity or unit price. Quantity and price accept only digits, comma, dot and spaces.
  • The sheet tabs below the grid show ! for a sheet with incomplete rows and ⚠ for a sheet with price conflicts.

Every correction is saved automatically about 0.7 seconds after you stop typing.

Checks that block saving

Three banners above the grid of the import page must be cleared before Save to project becomes active:

BannerMessage (EN)How to fix it
Required column missing"! {sheets}: a required column (description, unit of measure or quantity) is not mapped. Map all three before importing."Map Description, UoM and Qty on every sheet that has positions.
Incomplete rows"! {n} rows with incomplete data (missing description, unit of measure or quantity) in {n} sheets. Please fill them in before importing."Use Previous incomplete row / Next incomplete row; fill the cell, or set the row to Subsection or Unassign. Such rows carry ! in the row number.
Unit-price conflicts"⚠ {n} unit price conflicts affect {n} rows. Click ⚠ to resolve them before importing."Use Previous conflict / Next conflict and click ⚠ on a row to open the conflict dialog.

How to resolve unit-price conflicts

A unit-price conflict means two or more position rows have the same description, unit and note but different unit prices — in one sheet, across sheets, or against a position already in this BoQ. In BuildColab identical positions share one analysis and one price, so the import must decide. When comparing, spaces and upper/lower case are ignored, "m2" equals "м2", and "бр." equals "бр".

  1. Click ⚠ in the row number of a conflicting row. The dialog Unit price conflict (Конфликт в единична цена) lists every row of the group with its category path, Sheet, Row and Unit of measure, and editable Unit price, Description and Note. A position already in the BoQ is shown read-only with From the offer (and "Found in {n} places").
  2. Either make the prices equal, or make the rows different — usually by adding a distinguishing note such as "Floor 2" for genuinely different work.
  3. Each card turns ✓ Resolved when it no longer clashes. Click Done (Готово).
The Unit price conflict dialog with three rows, one from the offer and one resolved
Figure: Resolving a unit-price conflict
  1. The dialog title Unit price conflict and the number of affected rows.
  2. The card From the offer: the same position as it already is in the BoQ, with its unit price.
  3. The conflicting workbook row with its category path and row number.
  4. The editable Unit price, Description and Note fields of that row.
  5. Done closes the dialog.

How to save the import to the BoQ

  1. Optionally keep Label (Етикет) ticked and adjust Label name. The label is a filter category put on every position this import creates, so you can later filter or remove exactly what this file brought in. It starts as the file name.
  2. Click Save to project (Запази в проекта). It is active only when recognition is finished and no banner is left.
  3. The page returns to the BoQ while a background job Import BoQ (Импорт на КСС) writes the rows. A progress message follows it.
  4. On success: Data import completed successfully! (Импортът на данни завърши успешно!). The import becomes Saved to the project and the BoQ refreshes.

Other project members with access to the BoQ get the notification "{name} imported BoQ "{BoQ}" ({count} items) — project "{project}"". If categories had to be renamed, the message adds "{count} categories renamed so that no two siblings share a name" with up to the first three renames, for example "Walls" → "Walls (2)" (in "Floor 1"), or "at the top level". On failure: An error occurred while importing data; everything the job created is removed again, the import returns to In progress and shows the error, so you can fix it and save again.

Saving corrections back into the Excel file

Save to Excel file (Запази в Excel файла) writes all your corrections into a new version of the uploaded workbook, for example to send the corrected BoQ back to the client. Version 1 always stays the untouched upload, and each save produces "original + all corrections". On success: Version {n} saved. It does not change the BoQ. It does not work for .xls files, when the workbook was deleted, or for an import that is saving or saved.

Working on one import together

  • Everyone in your company with access to the BoQ can open the import from Imports in progress or by its link. Large imports with many conflicts can be split among colleagues; the hub shows the number of corrected rows.
  • Corrections are saved per row: two people editing different rows never conflict; on the same row the last change wins.
  • Changes by others appear on your page automatically. Your own unsaved edits are kept until they are saved.
  • Column mapping, saving to Excel and saving to the project check that nobody changed the import meanwhile. If someone did: "Someone else changed this import. The latest version has been loaded — review it and try again."
  • Closing the browser loses nothing; the page reopens exactly as it was left. Closing the tab with unsaved edits shows the browser's "leave site?" warning.

When an import page cannot be edited

Message (EN)Message (BG)
This import no longer exists — someone deleted it.Този импорт вече не съществува — някой го е изтрил.
This import has already been saved to the project and can no longer be edited.Този импорт вече е записан в проекта и не може да бъде редактиран.
This import is being saved to the project right now and cannot be edited until that finishes.Този импорт в момента се записва в проекта и не може да бъде редактиран, докато това приключи.
The uploaded workbook is no longer available, so this import can no longer be edited.Каченият файл вече не е наличен, затова този импорт не може да бъде редактиран.
This import could not be opened — its workbook could not be read.Този импорт не може да бъде отворен — файлът му не може да бъде прочетен.

Each of these shows Back to the BoQ. A link without the BoQ part shows Invalid project or BoQ.

How to delete an import

  1. In the import hub, click Delete (Изтрий) on the import card.
  2. Confirm Delete import (Изтриване на импорт): "Delete this import ({file})? The corrections made so far and the uploaded workbook go with it. A workbook already in use as an export base is kept."

Import with analyses

Use Import with analyses (Импортиране с анализи) when your file contains, under each position, its resource analysis. It is a single dialog that must be finished in one sitting; it is not offered on quantity-only BoQs.

File format for import with analyses

Only the first sheet is read; the header is in row 1.

ColumnHeaderContent
A—"No.1", "No.2" … marks a position row. A row with an index but no "No." is a category.
BИндексDotted index 1, 1.2, 1.2.3 that defines the nesting (at most 15 levels).
C—Not used.
DКодCode.
EИмеName of the category, position or resource.
Fм.ед.Unit. Required for every position.
GЗабележкаNote.
HРазх. нормаOn a position row: the quantity. On a resource row: the consumption rate. On additional-cost and profit rows: the percentage.
IЦенаUnit price, hourly rate or daily rate.
JДСР, %Delivery and storage costs %.
KКоеф.Additional coefficient.
LКрайна ценаIgnored.
MСтойностTotal; used to work out the price when column I is empty.

Under each position, section header rows with exactly these texts start the resource groups: МАТЕРИАЛИ:, МЕХАНИЗАЦИЯ:, ТРУД:, ДОП. РАЗХОДИ:, УСЛУГИ:. Rows starting with "ОБЩО …" or "КРАЙНА ЦЕНА" close them and subtotal rows are skipped. A row ПЕЧАЛБА, % sets the profit %. Rows "Доп.разх. (материали/механизация/труд/услуги)" set the additional-cost percentages. A position with no resource sections but a price is imported as one lump-sum service.

How to import with analyses

  1. In the import hub, click Import with analyses. In Select a file with analyses, choose or drag an XLSX file and click Continue (Продължи).
  2. Review Recognized tasks (Разпознати задачи): the tree on the left (Description, UoM, Qty, Unit price, Value, Note — description and note are editable) and, for the selected task, its analysis on the right. The Analysis template part shows whether the task matches an existing template ("{pct}% match", "≥90% similarity", "From history") or Will create a new template; each resource shows Reuses: "{name}" or Will be created.
  3. Clear the blocking banners: tasks that appear more than once in the file with different analyses or prices, and positions without a unit ("Add a unit in the file (column F) and import it again"). The banners about price differences with the existing offer and about tasks without resource data are information only.
  4. Click Save analyses (Запази анализите). A background job Importing analyses... runs; on success: "The analyses were imported successfully".

Import with analyses writes to the company library: it creates new task templates, materials, labor and machines where no match was found. If a task already had an analysis, the existing one is kept (Kept existing analyses); items that could not be saved are listed under Imported with omissions.

Import with applied prices (on behalf of a subcontractor)

When you record an offer on behalf of a self-managed subcontractor, Import opens a one-step dialog instead of the hub: choose the file (also from Company files), Recognize data, check the columns, then Save to project. The file is applied as a full replacement plan in a background job Apply prices: matching rows (same category path, description, unit and note) get the file's price and quantity, new rows are added, and rows that are not in the file are removed. Price conflicts do not block this mode. See Self-managed subcontractors and self-contracts.

Limits

LimitValue
File types.xlsx (recommended), .xls
File sizeUp to 200 MB; the File tab preview shows files up to 25 MB in the full viewer
Header searchFirst 15 rows of each sheet
Nesting depthUp to 15 levels (deeper means the columns were recognized wrongly)
Import / label nameUp to 255 characters
Unit price0 or more

Common questions

I imported the file twice and now every position is doubled. What do I do?

Import always adds rows. In Controls, filter by the label of the second import (it carries the file name), select the filtered positions and delete them. Next time check Imports in progress in the hub before starting.

Why is Save to project gray?

A banner is still open: a required column is not mapped, some rows miss description, unit or quantity, or there are unit-price conflicts. Recognition may also still be running. Clear every banner.

Why did everything become categories?

Either the description is read from the numbering column, or no unit/quantity column is mapped, so every row looks like a category. Fix it with Edit columns.

Why are my section titles missing?

They are probably merged cells spanning several columns, so the description column is empty for that row. Unmerge them in Excel and import again, or type the name in the grid and set the row to Subsection.

Why did "Walls" become "Walls (2)"?

There was already a category "Walls" on the same level. Category names on one level must be unique, so BuildColab added a number.

Can I import into an accepted budget or a signed contract?

No. Those are changed through a change order. The server answers "An accepted investor budget cannot be edited directly — change it through a change order."

"Someone else changed this import." What now?

A colleague changed the import while you were working. The latest version has been loaded; check it and repeat your step.

Can I close the browser in the middle of an import?

Yes. Every correction is saved on the server. Reopen it from Imports in progress in the hub.

Which file should I use for an import with analyses?

An XLSX with the layout in the table above — typically an export from estimating software that prints the analysis of every position under it, with the sections МАТЕРИАЛИ:, МЕХАНИЗАЦИЯ:, ТРУД:, ДОП. РАЗХОДИ:.