使用OpenXML将excel转换为数据表时,将第一个空列替换为包含c#中数据的第二列

时间:2018-03-13 08:42:17

标签: c# openxml

excel(XLSM)文件以第一列为空,第二列以值开头,依此类推,用立即列替换空列

XLSM文件:上传之前

enter image description here

XLSM FILE:上传xlsm后转移到立即空列

enter image description here

如何在不移动的情况下找到范围或总列 即:当我计算列时,它必须显示为3(A2,B2,C2) 但它在转换时给了我总列

下面是代码:

    private void Get_XLSM_Data(ref DataTable dt)
    {
        string strPath = Path.GetExtension(this.FilePath);

        if (strPath != null && strPath.ToUpper() == ".XLSM")
        {
            using (SpreadsheetDocument spreadSheetDocument = 
                SpreadsheetDocument.Open(this.FilePath, true))
            {
                IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook
                    .GetFirstChild<Sheets>().Elements<Sheet>();
                string relationshipId = sheets.First().Id.Value;
                WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument
                    .WorkbookPart.GetPartById(relationshipId);
                Worksheet workSheet = worksheetPart.Worksheet;
                var dimensionReference = workSheet.SheetDimension.Reference;
                var cellTablePart = workSheet.WorksheetPart.SingleCellTablePart;
                SheetData sheetData = workSheet.GetFirstChild<SheetData>();
                IEnumerable<Column> columnsDescendants = sheetData.Descendants<Column>();
                IEnumerable<Row> rows = sheetData.Descendants<Row>();
                var sheetIdValue = sheets.First().SheetId.Value;
                // ReSharper disable once PossibleNullReferenceException
                var column = workSheet.GetFirstChild<SheetData>().ChildElements.FirstOrDefault().ChildElements.Count();


                if (dt.TableName == "specific table ")
                {
                    dt.Columns.Clear();
                    for (int col = 1; col <= column; col++)
                    {
                        string colName = "Column" + (col);
                        dt.Columns.Add(colName);
                    }

                    //// START: To add Headers (First row) in data table
                    string[] rowData = new string[dt.Columns.Count];
                    int colIndex = 0;
                    foreach (Cell cell in rows.ElementAt(0))
                    {
                        rowData[colIndex] = GetCellValue(spreadSheetDocument, cell); colIndex++;
                    }

                    dt.Rows.Add(rowData);
                    //// END: To add Headers (First row) in data table
                }



                try
                {
                    for (int i = 1; i < rows.Count(); i++)
                    {
                        string[] rowData = new string[dt.Columns.Count];
                        int col = 0;
                        foreach (Cell cell in rows.ElementAt(i))
                        {
                            rowData[col] = GetCellValue(spreadSheetDocument, cell); col++;
                        }
                        dt.Rows.Add(rowData);
                    }

                }
             }
        }
    }
    public static string GetCellValue(SpreadsheetDocument document, Cell cell)
    {
      SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
        if (cell != null)
        {
            string cellValue = cell.CellValue != null ? cell.CellValue.InnerXml : String.Empty;

            if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
            {
                cellValue = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(cellValue)].InnerText;
            }
            else
            {
                if(!string.IsNullOrEmpty(cellValue))
                {
                    //return Convert.ToString(cellValue, CultureInfo.InvariantCulture);
                    return double.Parse(cellValue, CultureInfo.InvariantCulture).ToString();
                }
                return cellValue;
            }
            return cellValue;
        }
        return String.Empty;
    }       

2 个答案:

答案 0 :(得分:1)

Row row = worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>().FirstOrDefault();
var totalnumberOfColumns = 0;
if (row != null)
{
    var spans = row.Spans != null ? row.Spans.InnerText : "";
    if (spans != String.Empty)
    {
        //spans.Split(':')[1];
        string[] columns = spans.Split(':');
        startcolumnInuse = int.Parse(columns[0]);
        endColumnInUse = int.Parse(columns[1]);
        totalnumberOfColumns = int.Parse(columns[1]);
    }
}

下面是屏幕截图,通过上面的代码我已经共享

来查找跨越的最大列

这里我使用了不同的Excel文件(XLSM) MAXIMUM COLUMN PRESENT IS=9

答案 1 :(得分:0)

以下是通过跨度查找最大列的屏幕截图 以上代码我已经分享了

这里我使用了不同的Excel文件(XLSM)

MAXIMUM COLUMN PRESENT IS=9