在C#中将Excel命名范围转换为JSON

时间:2016-09-02 22:27:52

标签: c# arrays json excel

我正在尝试将所有命名范围从Excel工作簿转换为JSON格式。

到目前为止,我可以获取所有命名范围并从中获取数据。但是......我无法处理不同的数据类型和/或弄清楚如何正确嵌套到JSON格式。看起来我应该能够添加到嵌套列表或其他东西,然后使用JSON序列化程序?不确定是否可能。

我关心的所有命名范围都具有相同的格式......如下所示: my_[indicator]_[user-specified-value]

[indicator]总是SettingsInputOutput

[user-specified-value]可以是只包含文字和数字的字符串(即 - A-Z,a-z,0-9)

例如,my_Input_Months等于4

但是,在这种情况下,它只是int,但也可以是string或任何其他数据类型。

它也可以是一个或两个维度的数组。

这是我拥有的C#代码,用于抓取工作簿中所有命名区域的数据:

private void createJsonFormat()
{
    object missing = Type.Missing;

    // GET THE CURRENT WORKBOOK
    Excel.Workbook wb = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;

    // FIND OUT HOW MANY NAMED RANGES ARE IN THE WORKBOOK
    int intNames = wb.Names.Count;

    if (intNames != 0)
    {
        foreach (Excel.Name name in wb.Names)
        {
            string strValue = name.Value;
            string strLinkName = name.Name;
            if (strValue != "=#REF!#REF!")
            {
                strAddress = name.RefersToRange.Cells.get_Address(true, true, Excel.XlReferenceStyle.xlA1, missing, missing);
                strSheetName = name.RefersToRange.Cells.Worksheet.Name;
            }

            object objValue = name.RefersToRange.Value;
            string strValue2 = name.RefersToRange.Value2.ToString();

            string[] parts = strLinkName.Split(new char[] { '_' });

            if (parts[0] == "my")
            {
                switch (parts[1])
                {
                    case "Settings":
                        {
                            Debug.WriteLine(strLinkName + ": " + strValue2);
                            break;
                        }
                    case "Input":
                        {
                            Debug.WriteLine(strLinkName + ": " + strValue2);
                            break;
                        }
                    case "Output":
                        {
                            Debug.WriteLine(strLinkName + ": " + strValue2);
                            break;
                        }
                    default:
                        {
                            // DON'T CARE ABOUT THESE NAMED RANGES
                            break;
                        }
                }
            }

            if (strValue2 == "System.Object[,]")
            {
                string strValueHolder = string.Empty;

                int i = 0;

                foreach (var varValue3 in (dynamic)objValue)
                {

                    if (varValue3.ToString() != "")
                    {
                        if (i == 0)
                        {
                            strValueHolder = varValue3.ToString();
                        }
                        else
                        {
                            strValueHolder = strValueHolder + ", " + varValue3.ToString();
                        }
                    }

                    i++;
                }

                Debug.WriteLine(strValueHolder);
            }
        }
    }
}

这个输出是:

my_Input_Months: 4
my_Input_InitialAmt: 1000
my_Input_GrowthRate: 0.0025
my_Input_StartDate: 42736
my_Output_Dates: System.Object[,]
1/1/2017 12:00:00 AM, 2/28/2017 12:00:00 AM, 3/31/2017 12:00:00 AM, 4/30/2017 12:00:00 AM
my_Output_GrossAmts: System.Object[,]
1000, 1002.5, 1005.00625, 1007.518765625
my_Settings_ItemName: Best Name
my_Settings_ItemTypeId: 1

因此,如果我的数据总是完全相同,我想我可以将字符串拼凑在一起使其看起来像JSON,甚至可能创建一个类来保存数据,但事实上数据类型经常变化而且我永远不会知道我是否会得到单个值,一维数组或二维数组,真的很难建立一个结构(我认为)。

任何帮助都会很棒。

0 个答案:

没有答案