Всем спасибо, кстати я неправильно создал заголовок и это прокатило, хотя при помощи th я наверное стили бы уже не назначил через CSS style.
Вот правильная функция и к сожалению алгоритм создания заголовка отличен от алгоритма создания обычных строк, что нехорошо
function fromArrayOfObj(obj) {
let tr, td, NR = obj.length, body = document.body
//table
let tbl = document.createElement('table')
tbl.id = 'table';
//caption
let tcap = tbl.createCaption();
tcap.innerHTML = "Сотрудники";
//header
let thead = tbl.createTHead();
// thead.style.border = '1px solid black'; не работает
tr = thead.insertRow();
for (var key in obj[0]) {
let th = document.createElement("th");
th.innerHTML = key;
tr.appendChild(th);
th.style.border = '1px solid black';
th.style.fontWeight = 'bold';
th.style["text-align"] = 'center';
}
//fill table
for (var i = 0; i < NR; i++) {
tr = tbl.insertRow();
for (var key in obj[0]) {
td = tr.insertCell();
td.appendChild(document.createTextNode(obj[i][key]));
td.style.border = '1px solid black';
}
}
//apply styles
tbl.style.border = '2px solid black';
tbl.style.borderCollapse = 'collapse';
body.appendChild(tbl);
}