TimelineSheet.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. <script setup>
  2. // import Sheet from '@/components/Sheet.vue'
  3. import { ref, computed, onMounted } from 'vue'
  4. const props = defineProps({
  5. TableInfo:{
  6. type:Object,
  7. default:{}
  8. }
  9. })
  10. const tableHeight = ref(0)
  11. const rowTable = ref(null)
  12. const disabled = ref(true)
  13. const EdbKeys = ref(["EdbName", "Unit"])
  14. const cellRef = ref(null)
  15. const dateArr = computed (() => {
  16. return props.TableInfo.TableData.Data.length ? props.TableInfo.TableData.Data[0].Data.map(_ => _.DataTime) : []
  17. })
  18. const columnHeader = computed(() => {
  19. return getColumnHeaderCode(
  20. props.TableInfo.TableData.Data ? props.TableInfo.TableData.Data.length : 0
  21. );
  22. });
  23. const rowHeader = computed(() => {
  24. let total_length = dateArr.value.length + props.TableInfo.TableData.TextRowData.length;
  25. return getRowHeaderCode(total_length);
  26. });
  27. const minRow = computed(() => {
  28. return Math.min(props.TableInfo.ExtraConfig.TableFreeze.FreezeStartRow, props.TableInfo.ExtraConfig.TableFreeze.FreezeEndRow)
  29. });
  30. const maxRow = computed(() => {
  31. return Math.max(props.TableInfo.ExtraConfig.TableFreeze.FreezeStartRow, props.TableInfo.ExtraConfig.TableFreeze.FreezeEndRow)
  32. });
  33. const maxCol = computed(() => {
  34. return Math.max(props.TableInfo.ExtraConfig.TableFreeze.FreezeStartCol, props.TableInfo.ExtraConfig.TableFreeze.FreezeEndCol)
  35. });
  36. const minCol = computed(() => {
  37. return Math.min(props.TableInfo.ExtraConfig.TableFreeze.FreezeStartCol, props.TableInfo.ExtraConfig.TableFreeze.FreezeEndCol)
  38. });
  39. //手机端pc端不同样式
  40. const dynamicSty = computed(()=>{
  41. return isMobile() ? 'mobile-sty' : 'pc-sty';
  42. })
  43. //判断是否是手机设备
  44. function isMobile() {
  45. // 判断是否是移动设备的正则表达式
  46. const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
  47. // 获取用户代理信息
  48. const userAgent = navigator.userAgent;
  49. // 使用正则表达式检查用户代理信息
  50. return mobileRegex.test(userAgent);
  51. }
  52. // 字母列标
  53. function getColumnHeaderCode(len) {
  54. let tag_arr = [];
  55. for(let i=0;i<len;i++) tag_arr.push(String.fromCharCode(65+i));
  56. return tag_arr;
  57. }
  58. // 行标
  59. function getRowHeaderCode(len) {
  60. let tag_arr = [];
  61. for(let i=0;i<len;i++) tag_arr.push(String(1+i));
  62. return tag_arr;
  63. }
  64. // 判断展示小数位数值还是原来的值
  65. function showCellValue(cell){
  66. // console.log(cell)
  67. let Value=''
  68. if("Decimal" in cell&&cell.Decimal!=-1){
  69. const multiplier = Math.pow(10, cell.Decimal);
  70. const cellValue=+cell.Value
  71. Value= cell.Decimal == 0 ? Math.round(cellValue) : Math.round(cellValue * multiplier) / multiplier;
  72. }else{
  73. Value=cell.ShowValue
  74. }
  75. return Value
  76. }
  77. onMounted(() => {
  78. console.log('rowTable', rowTable.value.offsetHeight);
  79. tableHeight.value = rowTable.value ? rowTable.value.offsetHeight : 35;
  80. })
  81. // 是否固定列
  82. function isWithinColRange (index) {
  83. return rowHeader.value[index] >= minCol.value && rowHeader.value[index] <= maxCol.value
  84. }
  85. // 获取某一列的宽度
  86. function getColumnHeaderWidth (index) {
  87. return cellRef.value && cellRef.value ? cellRef.value[index].offsetWidth : 104
  88. }
  89. </script>
  90. <template>
  91. <div class="sheet-show-wrapper">
  92. <div :class="['table-wrapper',dynamicSty ]" v-if="props.TableInfo.ExcelType === 1">
  93. <table width="auto" border="0" class="table" :style="disabled ? 'width:100%':''" style="position: relative;">
  94. <thead>
  95. <tr ref="rowTable">
  96. <!-- 行头 -->
  97. <th class="th-tg sm"></th>
  98. <th class="th-tg"></th>
  99. <!-- 列头 -->
  100. <th
  101. ref="cellRef"
  102. v-for="(item, index) in columnHeader"
  103. :key="index"
  104. class="th-tg th-col"
  105. :data-cindex="item"
  106. :data-rindex="-1">
  107. {{item}}
  108. </th>
  109. </tr>
  110. </thead>
  111. <tbody>
  112. <tr v-for="(item, index) in EdbKeys" :key="item">
  113. <!-- 行头 -->
  114. <th class="th-tg sm"></th>
  115. <td rowspan="2" v-if="index === 0" class="head-column">
  116. 日期
  117. </td>
  118. <td
  119. v-for="(edb, sub_index) in TableInfo.TableData.Data"
  120. :key="sub_index"
  121. :data-rindex="-1"
  122. :data-cindex="columnHeader[sub_index]"
  123. :class="['data-cell',{
  124. 'one-bg':(index+1)%2&&index>0,
  125. 'tow-bg': (index+1)%2!==0&&index>0,
  126. 'head-column': index === 0,
  127. }]"
  128. >
  129. <template v-if="item === 'EdbName'">
  130. <span :class="{'edbname-td':disabled}" @click="edbJumpToBase(edb)">{{ edb.EdbAliasName||edb[item] }}</span>
  131. </template>
  132. <template v-else>{{ edb[item] }} / {{edb.Frequency }}</template>
  133. </td>
  134. </tr>
  135. <!-- 数据行 第一列日期-->
  136. <tr v-for="(date, dateIndex) in dateArr" :key="date" :style="TableInfo.ExtraConfig.TableFreeze ? `top: ${(dateIndex- minRow+1)*tableHeight}px;` : ''" :class="TableInfo.ExtraConfig.TableFreeze && rowHeader[dateIndex] >= minRow && rowHeader[dateIndex] <= maxRow ? 'fix' : ''">
  137. <!-- 行头 -->
  138. <th
  139. class="th-tg th-row sm"
  140. :data-cindex="-1"
  141. :data-rindex="rowHeader[dateIndex]"
  142. @contextmenu.prevent="rightClickHandle"
  143. >{{rowHeader[dateIndex]}}</th>
  144. <td
  145. :data-rindex="rowHeader[dateIndex]"
  146. :data-cindex="-1"
  147. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(dateIndex) ? `left: 0px;` : ''"
  148. :class="[TableInfo.ExtraConfig.TableFreeze && isWithinColRange(dateIndex) ? 'fix-col' : '']"
  149. >{{date}}</td>
  150. <td
  151. v-for="(edb, edb_index) in TableInfo.TableData.Data"
  152. :key="edb_index"
  153. :data-rindex="rowHeader[dateIndex]"
  154. :data-cindex="columnHeader[edb_index]"
  155. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(edb_index+dateArr.length) ? `left: ${(edb_index+dateArr.length- minCol+1)*getColumnHeaderWidth(edb_index+dateArr.length)}px;` : ''"
  156. :class="[([2,3,5].includes(edb.Data.find(_ =>_.DataTime === date)?.DataType)&&edb.Data.find(_ =>_.DataTime === date)?.ShowValue)?'insert': '', TableInfo.ExtraConfig.TableFreeze && isWithinColRange(edb_index+dateArr.length) ? 'fix-col' : '']"
  157. >
  158. <!-- 实际值/插值 -->
  159. <span
  160. :data-rindex="rowHeader[dateIndex]"
  161. :data-cindex="columnHeader[edb_index]"
  162. v-if="(edb.Data.find(_ =>_.DataTime === date)?.ShowValue&&!edb.Data.find(_ =>_.DataTime === date).CanEdit)||disabled"
  163. >
  164. {{showCellValue(edb.Data.find(_ =>_.DataTime === date)) || '-'}}
  165. </span>
  166. </td>
  167. </tr>
  168. <!-- 文本行 -->
  169. <tr v-for="(row,index) in TableInfo.TableData.TextRowData" :key="index" :style="TableInfo.ExtraConfig.TableFreeze ? `top: ${(index+dateArr.length-minRow+1)*tableHeight}px;` : ''" :class="TableInfo.ExtraConfig.TableFreeze && rowHeader[index+dateArr.length] >= minRow && rowHeader[index+dateArr.length] <= maxRow ? 'fix' : ''">
  170. <!-- 行头 -->
  171. <th
  172. class="th-tg th-row sm"
  173. @contextmenu.prevent="rightClickHandle"
  174. :data-rindex="rowHeader[index+dateArr.length]"
  175. :data-cindex="-1"
  176. >{{rowHeader[index+dateArr.length]}}</th>
  177. <td
  178. v-for="(cell, cell_index) in row"
  179. :key="`${index}_${cell_index}`"
  180. :data-rindex="rowHeader[index+dateArr.length]"
  181. :data-cindex="cell_index===0?-1:columnHeader[cell_index-1]"
  182. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(cell_index+dateArr.length) ? `left: ${(cell_index+dateArr.length- minCol+1)*getColumnHeaderWidth(cell_index+dateArr.length)}px;` : ''"
  183. :class="[([2,3,5].includes(cell.DataType)&&cell.ShowValue)?'insert': '', TableInfo.ExtraConfig.TableFreeze && isWithinColRange(cell_index+dateArr.length) ? 'fix-col' : '']"
  184. >
  185. <span
  186. :data-rindex="rowHeader[index+dateArr.length]"
  187. :data-cindex="cell_index===0?-1:columnHeader[cell_index-1]"
  188. v-if="(cell.ShowValue&&!cell.CanEdit)||disabled"
  189. > {{cell.ShowValue}}</span>
  190. </td>
  191. </tr>
  192. </tbody>
  193. </table>
  194. </div>
  195. <div :class="['table-wrapper',dynamicSty ]" v-else>
  196. <table width="auto" border="0" class="table" :style="disabled ? 'width:100%':''" style="position: relative;">
  197. <thead>
  198. <tr ref="rowTable">
  199. <!-- 行头 -->
  200. <th class="th-tg sm"></th>
  201. <th class="th-tg"></th>
  202. <th class="th-tg"></th>
  203. <!-- 列头 -->
  204. <th
  205. v-for="(item, index) in rowHeader"
  206. :key="index"
  207. ref="cellRef"
  208. class="th-tg th-col"
  209. :data-cindex="-1"
  210. :data-rindex="rowHeader[index]">
  211. {{item}}
  212. </th>
  213. </tr>
  214. </thead>
  215. <tbody>
  216. <tr>
  217. <!-- 行头 -->
  218. <th class="th-tg sm"></th>
  219. <td colspan="2" class="head-column">
  220. 日期
  221. </td>
  222. <!-- 日期列 -->
  223. <td
  224. v-for="(date, sub_index) in dateArr"
  225. :key="date"
  226. :data-rindex="rowHeader[sub_index]"
  227. :data-cindex="-1"
  228. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(sub_index) ? `left: ${(sub_index- minCol+1)*getColumnHeaderWidth(sub_index)}px;` : ''"
  229. :class="['data-cell','head-column',
  230. TableInfo.ExtraConfig.TableFreeze && isWithinColRange(sub_index) ? 'fix-col' : '']"
  231. >{{ date }}</td>
  232. <!-- 文本列 -->
  233. <td
  234. v-for="(column,index) in TableInfo.TableData.TextRowData"
  235. :key="index"
  236. :data-cindex="-1"
  237. :data-rindex="rowHeader[index+dateArr.length]"
  238. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(index+dateArr.length) ? `left: ${(index+dateArr.length- minCol+1)*getColumnHeaderWidth(index+dateArr.length)}px;` : ''"
  239. :class="'head-column', [([2,3,5].includes(column[0].DataType)&&column[0].ShowValue)?'insert': '', TableInfo.ExtraConfig.TableFreeze && isWithinColRange(index+dateArr.length) ? 'fix-col' : '']"
  240. @click="clickCell($event,column[0])"
  241. @dblclick="dblClickCell($event,column[0])"
  242. @copy="copyCellHandle($event,column[0])"
  243. @paste="pasteCellHandle($event,column[0])"
  244. >
  245. <span
  246. :data-cindex="-1"
  247. :data-rindex="rowHeader[index+dateArr.length]"
  248. > {{column[0].ShowValue}}</span>
  249. </td>
  250. </tr>
  251. <!-- 指标行 -->
  252. <tr v-for="(edb, edb_index) in TableInfo.TableData.Data" :key="edb.EdbInfoId" :style="TableInfo.ExtraConfig.TableFreeze ? `top: ${(edb_index- minRow+1)*tableHeight}px;` : ''" :class="TableInfo.ExtraConfig.TableFreeze && rowHeader[edb_index] >= minRow && rowHeader[edb_index] <= maxRow ? 'fix' : ''">
  253. <!-- 行头 -->
  254. <th
  255. class="th-tg th-row sm"
  256. :data-cindex="columnHeader[edb_index]"
  257. :data-rindex="-1"
  258. @contextmenu.prevent="rightClickHandle"
  259. >
  260. {{columnHeader[edb_index]}}
  261. </th>
  262. <!-- 名称 单位 -->
  263. <td
  264. v-for="(item, index) in EdbKeys"
  265. :key="index"
  266. :data-rindex="-1"
  267. :data-cindex="columnHeader[edb_index]"
  268. @click="() => { !disabled && item==='EdbName' && clickEdbName(edb)}"
  269. >
  270. <template v-if="item === 'EdbName'">
  271. <span :class="{'edbname-td':disabled}" @click="edbJumpToBase(edb)">{{ edb.EdbAliasName||(edb[item]) }}</span>
  272. </template>
  273. <template v-else>{{ edb[item] }}/{{edb.Frequency }}</template>
  274. </td>
  275. <!-- 数据列 -->
  276. <td
  277. v-for="(data, data_index) in edb.Data"
  278. :key="`${edb.EdbInfoId}_${rowHeader[data_index]}_${columnHeader[edb_index]}`"
  279. :data-rindex="rowHeader[data_index]"
  280. :data-cindex="columnHeader[edb_index]"
  281. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(data_index) ? `left: ${(data_index- minCol+1)*getColumnHeaderWidth(data_index)}px;` : ''"
  282. :class="[([2,3,5].includes(data.DataType)&&data.ShowValue)?'insert': '', TableInfo.ExtraConfig.TableFreeze && isWithinColRange(data_index) ? 'fix-col' : '']"
  283. @click="clickCell($event,data)"
  284. @dblclick="dblClickCell($event,data)"
  285. @copy="copyCellHandle($event,data)"
  286. @paste="pasteCellHandle($event,data)"
  287. >
  288. <!-- 实际值/插值 -->
  289. <span
  290. :data-rindex="rowHeader[data_index]"
  291. :data-cindex="columnHeader[edb_index]"
  292. >
  293. {{data.ShowValue || '-'}}
  294. </span>
  295. </td>
  296. <!-- 文本列 -->
  297. <td
  298. v-for="(column,column_index) in TableInfo.TableData.TextRowData"
  299. :key="`${rowHeader[column_index+dateArr.length]}_${columnHeader[edb_index]}`"
  300. :data-rindex="rowHeader[column_index+dateArr.length]"
  301. :data-cindex="columnHeader[edb_index]"
  302. :style="TableInfo.ExtraConfig.TableFreeze && isWithinColRange(column_index+dateArr.length) ? `left: ${(column_index+dateArr.length- minCol+1)*getColumnHeaderWidth(column_index+dateArr.length)}px;` : ''"
  303. :class="[([2,3,5].includes(column[edb_index+1].DataType)&&column[edb_index+1].ShowValue)?'insert': '', TableInfo.ExtraConfig.TableFreeze && isWithinColRange(column_index+dateArr.length) ? 'fix-col' : '']"
  304. @click="clickCell($event,column[edb_index+1])"
  305. @dblclick="dblClickCell($event,column[edb_index+1])"
  306. @copy="copyCellHandle($event,column[edb_index+1])"
  307. @paste="pasteCellHandle($event,column[edb_index+1])"
  308. >
  309. <span
  310. :data-rindex="rowHeader[column_index+dateArr.length]"
  311. :data-cindex="columnHeader[edb_index]"
  312. > {{column[edb_index+1].ShowValue}}</span>
  313. />
  314. </td>
  315. </tr>
  316. </tbody>
  317. </table>
  318. </div>
  319. <div class="tool sheet-bottom">
  320. <div class="sheet-source"
  321. v-if="TableInfo.SourcesFrom&&JSON.parse(TableInfo.SourcesFrom).isShow"
  322. :style="`
  323. color: ${ JSON.parse(TableInfo.SourcesFrom).color };
  324. font-size: ${ JSON.parse(TableInfo.SourcesFrom).fontSize }px;
  325. `"
  326. >
  327. source:<em>{{ JSON.parse(TableInfo.SourcesFrom).text}}</em>
  328. </div>
  329. </div>
  330. </div>
  331. </template>
  332. <style lang='scss' scoped>
  333. // sheet-show-wrapper 相关样式
  334. .sheet-show-wrapper {
  335. max-width: 1200px;
  336. overflow: hidden;
  337. position: relative;
  338. margin: 0 auto;
  339. background: #fff;
  340. // table-wrapper 样式
  341. .table-wrapper {
  342. max-width: calc(100vw - 20px);
  343. max-height: calc(100vh - 400px);
  344. margin: 0 auto;
  345. overflow: auto;
  346. -webkit-overflow-scrolling: touch; /* ios滚动条 */
  347. }
  348. .tool {
  349. margin-top: 5px;
  350. span {
  351. cursor: pointer;
  352. }
  353. }
  354. .sheet-bottom {
  355. display: flex;
  356. align-items: center;
  357. justify-content: space-between;
  358. white-space: nowrap;
  359. padding: 0 10px;
  360. .sheet-source {
  361. width: 30%;
  362. min-width: 150px;
  363. overflow: hidden;
  364. text-overflow: ellipsis;
  365. }
  366. }
  367. }
  368. // 表格相关样式
  369. .table {
  370. width: 100%;
  371. font-size: 14px;
  372. color: #333;
  373. td, th {
  374. width: 104px;
  375. min-width: 104px;
  376. height: 35px;
  377. background: #fff;
  378. text-align: center;
  379. word-break: break-all;
  380. border: none;
  381. outline-color: #dcdfe6;
  382. outline-style: solid;
  383. outline-width: 1px;
  384. word-wrap: break-word;
  385. white-space: nowrap;
  386. overflow: hidden;
  387. text-overflow: ellipsis;
  388. position: relative;
  389. &:first-child {
  390. border-left: 1px solid #dcdfe6;
  391. }
  392. &.td-chose::after {
  393. position: absolute;
  394. top: 0;
  395. left: 0;
  396. right: 0;
  397. bottom: 0;
  398. content: "";
  399. display: block;
  400. outline: 0;
  401. border: 2px solid #0033FF;
  402. box-shadow: 0 0 5px rgba(73, 177, 249, .5);
  403. }
  404. &.insert {
  405. background: #FFEFDD;
  406. }
  407. .edbname-td {
  408. &:hover {
  409. text-decoration: underline;
  410. }
  411. }
  412. &.fix-col {
  413. position: sticky;
  414. left: 0;
  415. z-index: 98; // 表格右键操作弹窗为99
  416. }
  417. }
  418. .th-tg {
  419. background: #EBEEF5;
  420. &:hover {
  421. cursor: pointer;
  422. background: #ddd;
  423. }
  424. &.sm {
  425. width: 36px;
  426. min-width: 36px;
  427. max-width: 36px;
  428. }
  429. }
  430. .data-cell {
  431. color: #333;
  432. &.one-bg {
  433. background-color: #EFEEF1;
  434. }
  435. &.two-bg {
  436. background-color: #fff;
  437. }
  438. }
  439. .thead-sticky {
  440. position: sticky;
  441. top: 0;
  442. }
  443. .head-column {
  444. background-color: #505B78;
  445. color: #fff;
  446. }
  447. .split-word {
  448. span {
  449. display: inline;
  450. }
  451. }
  452. }
  453. tr {
  454. &.fix {
  455. position: sticky;
  456. top: 0;
  457. z-index: 98; // 表格右键操作弹窗为99
  458. }
  459. }
  460. // 滚动条样式
  461. ::-webkit-scrollbar {
  462. width: 6px;
  463. height: 6px;
  464. }
  465. ::-webkit-scrollbar-track {
  466. background: rgb(239, 239, 239);
  467. border-radius: 2px;
  468. }
  469. ::-webkit-scrollbar-thumb {
  470. background: #ccc;
  471. border-radius: 10px;
  472. &:hover {
  473. background: #888;
  474. }
  475. }
  476. ::-webkit-scrollbar-corner {
  477. background: #666;
  478. }
  479. // PC端表格样式
  480. .pc-sty table {
  481. table-layout: auto;
  482. td, th {
  483. width: auto;
  484. height: auto;
  485. padding: 0.4em 0;
  486. }
  487. }
  488. // 移动端表格样式
  489. .mobile-sty table {
  490. table-layout: auto;
  491. td, th {
  492. min-width: 120px;
  493. height: 40px;
  494. }
  495. }
  496. // 背景水印样式
  497. .background-watermark {
  498. background-repeat: no-repeat;
  499. background-position: center center;
  500. background-size: 100%;
  501. }
  502. @media screen and (min-width: 650px) {
  503. .sheet-show-wrapper {
  504. .table-wrapper {
  505. max-height: calc(100vh - 220px);
  506. }
  507. .tool {
  508. margin-top: 3px;
  509. }
  510. .sheet-bottom {
  511. padding: 0 5px;
  512. .sheet-source {
  513. width: 15%;
  514. min-width: 75px;
  515. }
  516. }
  517. }
  518. // 表格相关样式
  519. .table {
  520. width: 100%;
  521. font-size: 7px;
  522. color: #333;
  523. td, th {
  524. width: 52px;
  525. min-width: 52px;
  526. height: 17px;
  527. }
  528. .th-tg {
  529. &.sm {
  530. width: 18px;
  531. min-width: 18px;
  532. max-width: 18px;
  533. }
  534. }
  535. }
  536. // 滚动条样式
  537. ::-webkit-scrollbar {
  538. width: 3px;
  539. height: 3px;
  540. }
  541. ::-webkit-scrollbar-track {
  542. background: rgb(239, 239, 239);
  543. border-radius: 1px;
  544. }
  545. ::-webkit-scrollbar-thumb {
  546. background: #ccc;
  547. border-radius: 5px;
  548. }
  549. // 移动端表格样式
  550. .mobile-sty table {
  551. td, th {
  552. min-width: 60px;
  553. height: 20px;
  554. }
  555. }
  556. }
  557. </style>