关于excel的get_Range方法

时间:2021-02-06 16:57:42
我首先sheet上所有有内容的单元格的范围得到,比如:Range range = xlsheet.get_Range("A1","E10")
然后从这个range里要把每个单元格的数据再取出来使用,用了range[1,1].value2为什么不行,运行的时候总是出错,另外试了range.cells[1,1].value 也一样不行

7 个解决方案

#1


报什么错? 

为什么要先取所有单元格的范围?  一个个取有什么问题吗?

#2


注意大小写啊
Value,Value2
  

#3


.value2取出来的值是单元格类型,若是字符串类型,要.value2.ToString();
当然若你的get_Range范围内的单元格没有合并的话,返回的会是一个代表你的单元格对象范围信息的值,类似system[object,object]这种样子。

若是一个单元格那肯定是可以的
Range range= .get_Range("A1","A1"); 
string str=range.value2.tostring().trim();

trim()是去除多余空格,最好加上

#4


师范代码


        /// <summary>
        /// 读取一个连续区域的Cell的值(矩形区域,包含一行或一列,或多行,多列),返回一个一维字符串数组。
        /// </summary>
        /// <param name="StartCell">StartCell是要写入区域的左上角单元格</param>
        /// <param name="EndCell">EndCell是要写入区域的右下角单元格</param>
        /// <returns>值的集合</returns>
        public string[] getCellsValue(string StartCell, string EndCell)
        {
            string[] sValue = null;
            //try
            //{
            xlRange = (Excel.Range)xlSheet.get_Range(StartCell, EndCell);
            sValue = new string[xlRange.Count];
            int rowStartIndex = ((Excel.Range)xlSheet.get_Range(StartCell, StartCell)).Row;  //起始行号
            int columnStartIndex = ((Excel.Range)xlSheet.get_Range(StartCell, StartCell)).Column; //起始列号
            int rowNum = xlRange.Rows.Count;     //行数目
            int columnNum = xlRange.Columns.Count;    //列数目
            int index = 0;
            for (int i = rowStartIndex; i < rowStartIndex + rowNum; i++)
            {
                for (int j = columnStartIndex; j < columnNum + columnStartIndex; j++)
                {
                    //读到空值null和读到空串""分别处理
                    sValue[index] = ((Excel.Range)xlSheet.Cells[i, j]).Text.ToString();
                    index++;
                }
            }
            //}
            //catch (Exception e)
            //{
            //    CloseXlApp();
            //    throw new Exception(e.Message);
            //}
            return (sValue);
        }

#5


string ss = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[1, 1]).Value2.ToString();

另外Excel没有[i,j](i=0或者j=0);

#6



   public static DataSet ReadExcel2003(string excelPath)
        {
            DataSet ds = new DataSet();

            //string workName = "";
            Microsoft.Office.Interop.Excel.Application xApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

            xApp.Visible = false;
            //得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
            Microsoft.Office.Interop.Excel.Workbook xBook = xApp.Workbooks._Open(excelPath,
            Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            //xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
            //指定要操作的Sheet,两种方式:

            Microsoft.Office.Interop.Excel.Sheets xSheets = xBook.Sheets;
            for (int k = 1; k <= xSheets.Count; k++)
            {
                Microsoft.Office.Interop.Excel.Worksheet xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xSheets[k];
                //查找列数
                int rowCount = 0;
                for (int i = 1; i < xSheet.Rows.Count; i++)
                {
                    if (((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, 1]).Value2 == null)
                    {
                        rowCount = i;
                        break;
                    }
                }
                //查找行数
                int columnCount = 0;
                for (int i = 1; i < xSheet.Columns.Count; i++)
                {
                    if (((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[2, i]).Value2 == null)
                    {
                        columnCount = i;
                        break;
                    }
                }
                DataTable dt = new DataTable();
                for (int i = 1; i < columnCount; i++)
                {
                    string ss = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[1, i]).Value2.ToString();
                    if (ss != "")
                    {
                        dt.Columns.Add(ss);
                    }
                    else
                    {
                        dt.Columns.Add("Column" + i);
                    }
                }
                for (int i = 2; i < rowCount; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 1; j < columnCount; j++)
                    {
                        dr[j - 1] = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, j]).Value2 == null ? "" : ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, j]).Value2.ToString();
                    }
                    dt.Rows.Add(dr);
                }

                ds.Tables.Add(dt);
            }
            try
            {
                xBook.Save();

                //Microsoft.Office.Interop.Excel.Worksheet xSheet2=(Microsoft.Office.Interop.Excel.Worksheet)xApp.ActiveSheet;
                xBook.Close(false, false, Missing.Value);
                xApp.Quit();
            }
            catch { }
            IntPtr t = new IntPtr(xApp.Hwnd);
            int m = 0;
            GetWindowThreadProcessId(t, out m);
            Process p = Process.GetProcessById(m);
            p.Kill();
            return ds;
        }


这个可以读取多个excel的工作簿返回dataset

#7


上面需要添加引用

using System.Runtime.InteropServices;

注册一个方法

[DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr intptr, out int ID);

#1


报什么错? 

为什么要先取所有单元格的范围?  一个个取有什么问题吗?

#2


注意大小写啊
Value,Value2
  

#3


.value2取出来的值是单元格类型,若是字符串类型,要.value2.ToString();
当然若你的get_Range范围内的单元格没有合并的话,返回的会是一个代表你的单元格对象范围信息的值,类似system[object,object]这种样子。

若是一个单元格那肯定是可以的
Range range= .get_Range("A1","A1"); 
string str=range.value2.tostring().trim();

trim()是去除多余空格,最好加上

#4


师范代码


        /// <summary>
        /// 读取一个连续区域的Cell的值(矩形区域,包含一行或一列,或多行,多列),返回一个一维字符串数组。
        /// </summary>
        /// <param name="StartCell">StartCell是要写入区域的左上角单元格</param>
        /// <param name="EndCell">EndCell是要写入区域的右下角单元格</param>
        /// <returns>值的集合</returns>
        public string[] getCellsValue(string StartCell, string EndCell)
        {
            string[] sValue = null;
            //try
            //{
            xlRange = (Excel.Range)xlSheet.get_Range(StartCell, EndCell);
            sValue = new string[xlRange.Count];
            int rowStartIndex = ((Excel.Range)xlSheet.get_Range(StartCell, StartCell)).Row;  //起始行号
            int columnStartIndex = ((Excel.Range)xlSheet.get_Range(StartCell, StartCell)).Column; //起始列号
            int rowNum = xlRange.Rows.Count;     //行数目
            int columnNum = xlRange.Columns.Count;    //列数目
            int index = 0;
            for (int i = rowStartIndex; i < rowStartIndex + rowNum; i++)
            {
                for (int j = columnStartIndex; j < columnNum + columnStartIndex; j++)
                {
                    //读到空值null和读到空串""分别处理
                    sValue[index] = ((Excel.Range)xlSheet.Cells[i, j]).Text.ToString();
                    index++;
                }
            }
            //}
            //catch (Exception e)
            //{
            //    CloseXlApp();
            //    throw new Exception(e.Message);
            //}
            return (sValue);
        }

#5


string ss = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[1, 1]).Value2.ToString();

另外Excel没有[i,j](i=0或者j=0);

#6



   public static DataSet ReadExcel2003(string excelPath)
        {
            DataSet ds = new DataSet();

            //string workName = "";
            Microsoft.Office.Interop.Excel.Application xApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

            xApp.Visible = false;
            //得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
            Microsoft.Office.Interop.Excel.Workbook xBook = xApp.Workbooks._Open(excelPath,
            Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            //xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
            //指定要操作的Sheet,两种方式:

            Microsoft.Office.Interop.Excel.Sheets xSheets = xBook.Sheets;
            for (int k = 1; k <= xSheets.Count; k++)
            {
                Microsoft.Office.Interop.Excel.Worksheet xSheet = (Microsoft.Office.Interop.Excel.Worksheet)xSheets[k];
                //查找列数
                int rowCount = 0;
                for (int i = 1; i < xSheet.Rows.Count; i++)
                {
                    if (((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, 1]).Value2 == null)
                    {
                        rowCount = i;
                        break;
                    }
                }
                //查找行数
                int columnCount = 0;
                for (int i = 1; i < xSheet.Columns.Count; i++)
                {
                    if (((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[2, i]).Value2 == null)
                    {
                        columnCount = i;
                        break;
                    }
                }
                DataTable dt = new DataTable();
                for (int i = 1; i < columnCount; i++)
                {
                    string ss = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[1, i]).Value2.ToString();
                    if (ss != "")
                    {
                        dt.Columns.Add(ss);
                    }
                    else
                    {
                        dt.Columns.Add("Column" + i);
                    }
                }
                for (int i = 2; i < rowCount; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 1; j < columnCount; j++)
                    {
                        dr[j - 1] = ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, j]).Value2 == null ? "" : ((Microsoft.Office.Interop.Excel.Range)xSheet.Cells[i, j]).Value2.ToString();
                    }
                    dt.Rows.Add(dr);
                }

                ds.Tables.Add(dt);
            }
            try
            {
                xBook.Save();

                //Microsoft.Office.Interop.Excel.Worksheet xSheet2=(Microsoft.Office.Interop.Excel.Worksheet)xApp.ActiveSheet;
                xBook.Close(false, false, Missing.Value);
                xApp.Quit();
            }
            catch { }
            IntPtr t = new IntPtr(xApp.Hwnd);
            int m = 0;
            GetWindowThreadProcessId(t, out m);
            Process p = Process.GetProcessById(m);
            p.Kill();
            return ds;
        }


这个可以读取多个excel的工作簿返回dataset

#7


上面需要添加引用

using System.Runtime.InteropServices;

注册一个方法

[DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr intptr, out int ID);